测试breeze应用程序

时间:2013-04-30 10:31:33

标签: javascript testing jasmine breeze durandal

我正在使用durandal,breeze和knockout进行应用程序。我已经开始实施一些测试了。我遇到的第一个问题是决定我应该测试什么,不测试什么。我知道我应该测试一切,但在一个小公司里并不总是可能。

我的第二个问题是如何测试我对服务器的调用。我在微风页面上看到了一些关于测试的信息。我也见过DocCode示例。但我想知道更多关于如何做到这一点的意见。

我的问题是:

  1. 我应该在微风电话中测试什么?
  2. 我想测试一下,模仿后端。可能吗?任何一个例子?
  3. 任何建议或评论都会很棒

1 个答案:

答案 0 :(得分:16)

哇......这是个大问题!

这个主题有一点in the documentation。不足以确定。

我猜你是JavaScript测试的新手。如果你看过DocCode,你知道我们在这里使用QUnit。许多人更喜欢Jasmine,Mocha或其他东西;我只能和QUnit说话。

第一步是学习QUnit。这并不难。 QUnit's own intro很好。我喜欢Ben Alhman's slide deck

接下来,我会练习对您的业务逻辑进行小规模的测试,而这些测试不会过时。可以是ViewModel中的任何有趣逻辑,也可能是模型(实体)对象中的某些计算属性。

您可以非常轻松地测试VM与“DataContext”的交互,而无需通过网络。创建一个“FakeDataContext”并将其注入您的测试而不是真实测试。或者,您可以在战略位置“monkey patch”真正的“DataContext”,将其变成假的。

当伪造DataContext时,我发现利用Breeze将查询限制在本地缓存的能力很有用。本地缓存用作内存的代理,用于从服务器检索的数据。

这可以像设置经理默认FetchStrategy的{​​{1}}一样简单......也许就像这样

var queryOptions = new QueryOptions({ 
    mergeStrategy: MergeStrategy.PreserveChanges, 
    fetchStrategy: FetchStrategy.FromCache 
});

var entityManager = new EntityManager({ 
    serviceName: "yourEndpoint", 
    queryOptions: queryOptions
});

现在您的查询将全部定向到缓存(除非他们有明确的QueryOptions个。)

现在通过使用测试数据填充缓存使其变得有用。 DocCode中有许多伪造实体的例子。这是一个伪造客户的例子:

   var testCustomer = manager.createEntity('Customer', {
       // test values
       CustomerID: testCustomerID,
       CompanyName: testCustomerName,
       ...
    }, breeze.EntityState.Unchanged); // as if fetched from the database

如果我需要重复使用相同的测试数据,我会编写一个“数据母”,为我填充带有测试数据的EntityManager。

我可以通过这种方式进行大量测试而无需点击服务器。我一直在使用JavaScript中的Breeze实体......就像我在生产代码中一样。我不需要学习模拟库或注入其他工具。

另一种方法 - 更难,更低级,但更强大 - 是用虚假替换Breeze default AJAX adapter,返回测试JSON值,就像它们来自服务器一样。您可以使用像Fiddler这样的工具从实际有效负载快照中制作假JSON。您还可以使用此技巧来模拟服务器端保存行为。

2013年5月3日更新

如我刚才所述,DocCode Sample包含一个用于模拟服务器响应的新QueryStrategy。查看 testAjaxAdapter.js ,了解如何在 testAjaxAdapterTests.js 中使用它。这个特定版本的DocCode目前仅在GitHub上,但它将在v.1.3.2之后立即正式发布。

...更新结束;回到原帖...

伪造的AJAX适配器中伪造JSON流看起来像PITA太多吗? 打破你疯狂的Breeze技能并写一个custom JsonResultsAdapter来创造那些假货。让您的假AJAX适配器为每个查询请求返回一个空数组。然后,您可以在TestAjaxAdapter的{​​{1}}和extractData方法中执行任何操作。

我相信很明显你也可以假装你的服务器端控制器。当然,您的测试仍然会“通过电线”到达该控制器。

希望这些线索足以让你朝着令人满意的方向前进。

2013年4月30日更新

Breeze需要元数据来完成它的工作。您的元数据来自服务器。调用服务器获取元数据似乎无法完全断开运行测试的目的。

如此真实。现在我在这一点上不是一个坚持者。我不介意在服务器上点击测试模块顶部的元数据......只需要一次......然后运行其余的测试而无需前往服务器获取元数据。但是,如果您是纯粹主义者或者您不想这样做,您可以将服务器端元数据写入服务器上的JavaScript文件,并将该脚本静态加载到测试运行器的HTML页面上,就像任何其他脚本一样。

有关此技术的示例,请查看visitNode,该文件将在即将到来的(本周晚些时候)v.1.3.2 DocCode示例中为Northwind模型生成JavaScript文件。 DocCode测试使用 require.js 动态加载JavaScript文件。 metadataTests.js 测试文件显示了如何使用require加载生成的 northwindMetadata.js 。如果你没有使用 require.js ,你就不必那么聪明。

自我注意:写一些说明这些技术的样本。