测试breeze应用程序

jvr*_*nte 11 javascript testing jasmine breeze durandal

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

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

我的问题是:

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

War*_*ard 16

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

文档中有关于此主题的内容.不足以确定.

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

第一步是学习QUnit.这并不难.QUnit自己的介绍很好.我喜欢Ben Alhman的幻灯片.

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

您可以非常轻松地测试VM与"DataContext"的交互,而无需通过线路.创建一个"FakeDataContext"并将其注入您的测试而不是真实测试.或者,您可以在战略位置" 修补 "真正的"DataContext",将其变成假的.

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

这可以像设置FetchStrategy管理器的默认值一样简单QueryOptions......也许就像这样

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

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

现在,您的查询将全部定向到缓存(除非他们有QueryStrategy自己的显式).

现在通过使用测试数据填充缓存使其变得有用.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 默认的AJAX适配器,返回测试JSON值,就像它们来自服务器一样.您可以使用像Fiddler这样的工具从实际有效负载快照中制作假JSON.您还可以使用此技巧来模拟服务器端保存行为.

2013年5月3日更新

DocCode样品包括一个新TestAjaxAdapter的,因为我刚才描述的模拟服务器的响应.查看testAjaxAdapter.js并了解如何在testAjaxAdapterTests.js中使用它.这个特定版本的DocCode现在只在GitHub发布,但它将在v.1.3.2之后的版本中正式发布.

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

伪造的AJAX适配器中伪造JSON流看起来像PITA太多吗?打破疯狂的Breeze技能并编写一个自定义的JsonResultsAdapter来创建这些假货​​.让您的假AJAX适配器为每个查询请求返回一个空数组.然后你可以在你的方法extractDatavisitNode方法中做任何你想做的事情JsonResultsAdapter.

我相信很明显你也可以伪造你的服务器端控制器.当然,您的测试仍然会"通过线路"到达该控制器.

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

2013年4月30日更新

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

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

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

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