mocking - 在breezejs上实现模拟数据服务(查询失败)

标签 mocking metadata breeze dataservice

我正在尝试实现模拟数据服务。我正在注册新的数据类型,使用初始化数据创建一个新实体,但在执行查询时出现错误:“没有可用于此查询的元数据”。我不明白为什么会这样。我的实体管理器包含我注册的数据类型,还包含创建的实体的集合。我认为我的查询由于命名空间而失败,所以我尝试查询“Tag:#Football.Models” - 相同的结果。我也尝试过executeLocally()方法,同样的东西......

步骤:

1) 创建breeze数据服务、数据存储和管理器。

2) 创建新的元数据类型并将其添加到数据存储区。

3)创建注册类型的新实体并通过一些模拟数据初始化它。

4) 执行查询以获取实体集合; 第 4 步失败 - 出现错误:“错误:没有可用于此查询的元数据”

这是我的代码:

          //1st step
           var mockDataService = new breeze.DataService({
                serviceName: "mockDataService",
                hasServerMetadata: false
            });

            var mockMetadataStore = new breeze.MetadataStore(
                {
                    namingConvention: breeze.NamingConvention.camelCase
                });

            var queryOptions = new breeze.QueryOptions({
                fetchStrategy: breeze.FetchStrategy.FromLocalCache
            });

            var entityManager = new breeze.EntityManager({
                dataService: mockDataService,
                metadataStore: mockMetadataStore,
                queryOptions: queryOptions
            });
           // 2nd step
            var et = new breeze.EntityType({
                shortName: "Tag",
                namespace: "Football.Models",
                autoGeneratedKeyType: breeze.AutoGeneratedKeyType.Identity,
                defaultResourceName: "tags"
            });
            et.addProperty(new breeze.DataProperty({
                name: "id",
                dataType: breeze.DataType.Int32,
                isNullable: false,
                isPartOfKey: true
            }));
            et.addProperty(new breeze.DataProperty({
                name: "name",
                dataType: breeze.DataType.String,
                isNullable: false
            }));
            mockMetadataStore.addEntityType(et);
            mockMetadataStore.registerEntityTypeCtor("Tag", null);
                //3rd step 
                etType = mockMetadataStore.getEntityType("Tag");
            var newTag = etType.createEntity({id:1,name:"tag"});
            entityManager.addEntity(newTag);
                // 4th step
                var a =  breeze.EntityQuery
              .from("Tag")
              .using(entityManager).execute()
              .then(querySucceed).fail( function(err) {
                    alert(err);
                                // and i got an error:
                                // Error: There is no metadata available for this query
               });;

最佳答案

从版本1.2.7开始更新

您应该不再需要调用 setEntityTypeForResourceNameaddDataService 方法来完成您描述的模拟设置。

--- 先前的答案----------------------------------------------------

你们很接近。您需要做的就是添加以下两行

   mockMetadataStore.setEntityTypeForResourceName("Tag", et); // or "Tags"
   mockMetadataStore.addDataService(mockDataService);

此行之后

   mockMetadataStore.addEntityType(et);

在这种情况下,实际上不需要这些,但目前它们是必需的。下一版本将删除对此“额外”代码的需求。这些方法仍然有用,但只是不适用于这种特定情况。

此外,您还应该更改 defaultResourceNameEntityQuery.from 子句,以便名称匹配。 (这包括案例 - 请参阅下面的评论)。

原因是 defaultResourceName 是您正在查询的“集合/资源”的名称,而不是“entityType”的名称,即资源名称是您要传递的内容EntityQuery.from 子句。一个好的约定是资源名称是它查询的实体类型名称的复数版本,尽管这绝不是必需的。因此,您可以更改“from”子句或“defaultResourceName”

旁注,多个资源名称可以返回相同的实体类型,因此名称“defaultResourceName”中的“默认”。

此外,只有属性名称会通过namingConventions 的转换,因此您的resourceNames 应该完全服务器期望的名称。

关于mocking - 在breezejs上实现模拟数据服务(查询失败),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15619824/

相关文章:

java - 在Spring测试中,如何使用MockRestServiceServer仅模拟一个特定的调用?

Python 使用部分测试属性

ruby-on-rails - 在 Rails 3.2.6 中使用 Paperclip-FFMPEG 从视频中获取元数据

SQL Server : Extract Table Meta-Data (description, 字段及其数据类型)

javascript - Breeze js : inlineCount is incorrect when sorting by navigation property

javascript - Breeze - 延迟加载导航属性

c# - 如何模拟自定义 UserStore 和 RoleStore

java - Java 中的 FTP 单元测试(JSch 和 MockFtpServer)

Python:从 PNG 中提取元数据

javascript - BreezeJS 中央错误处理程序和自动重试