11

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

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

我的问题是:

  1. 我应该在微风电话中测试什么?
  2. 我想对此进行测试,模拟后端。可能吗?有什么例子吗?
  3. 任何建议或评论都会很棒
4

1 回答 1

16

哇……这是个大问题!

文档中有一些关于这个主题的内容。还不足以确定。

我猜你对 JavaScript 测试相当陌生。如果您看过DocCode,就会知道我们在这里使用 QUnit。许多人更喜欢茉莉、摩卡或其他东西;我只能和 QUnit 说话。

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

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

您可以很容易地测试 VM 与“DataContext”的交互,而无需通过网络。创建一个“FakeDataContext”并将其注入您的测试而不是真实的。或者,您可以在战略位置“猴子修补”真正的“DataContext”,将其变成假货。

在伪造 DataContext 时,我发现利用 Breeze 将查询限制到本地缓存的能力很有用。本地缓存充当内存中的代理项,以替代本来可以从服务器检索到的数据。

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

var queryOptions = new QueryOptions({
    合并策略:合并策略.PreserveChanges,
    fetchStrategy:FetchStrategy.FromCache
});

var entityManager = 新的EntityManager({
    服务名称:“你的端点”,
    查询选项:查询选项
});

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

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

   var testCustomer = manager.createEntity('客户', {
       // 测试值
       客户 ID:testCustomerID,
       公司名称:testCustomerName,
       ...
    }, 微风.EntityState.Unchanged); // 就像从数据库中获取一样

如果我重复需要相同的测试数据,我会编写一个“Data Mother”,它会为我填充一个带有测试数据的 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 适配器为每个查询请求返回一个空数组。extractData然后你可以在你的和visitNode方法中做任何你想做的事情JsonResultsAdapter

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

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

2013 年 4 月 30 日更新

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

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

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

自我注意:写一些示例来说明这些技术。

于 2013-04-30T20:13:48.703 回答