【问题标题】:Testing breeze application测试微风应用
【发布时间】:2013-04-30 10:31:33
【问题描述】:

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

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

我的问题是:

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

【问题讨论】:

    标签: javascript testing jasmine breeze durandal


    【解决方案1】:

    哇...这是个大问题!

    in the documentation 有一些关于这个主题的内容。还不足以确定。

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

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

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

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

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

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

    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 default AJAX adapter 替换为返回测试 JSON 值的假冒,就好像它们来自服务器一样。您可以使用 Fiddler 之类的工具从实际有效负载快照中制作假 JSON。您还可以使用此技巧来模拟服务器端保存行为。

    2013 年 5 月 3 日更新

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

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

    在你的假 AJAX 适配器中伪造 JSON 流是否看起来太像 PITA? 打破你疯狂的微风技能并写一个custom JsonResultsAdapter来制造那些假货。让您的假 AJAX 适配器为每个查询请求返回一个空数组。然后你可以在你的JsonResultsAdapterextractDatavisitNode 方法中做任何你想做的事情。

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

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

    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,你不必那么聪明。

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

    【讨论】:

    • 我有一个关于测试查询的问题,在进行第一次查询之前,我需要获取元数据。我如何在不调用服务器的情况下模拟它。非常感谢您的回答,给我的测试加注星标非常好。
    • 见上面的更新!我还没有发布这个......但它工作正常。
    • 很遗憾我们不能收藏答案... :)
    • 我已经成功使用 mockJax 库 - github.com/appendto/jquery-mockjax - 将处理程序透明地附加到指定的 URL。无需编写自定义 Breeze AJAX 适配器,因为 mockJax 可与 jQuery AJAX(默认的 Breeze AJAX 适配器)一起使用
    猜你喜欢
    • 1970-01-01
    • 2022-07-28
    • 2013-09-01
    • 2021-10-12
    • 1970-01-01
    • 2014-02-04
    • 2018-05-13
    • 2017-10-04
    • 2019-08-25
    相关资源
    最近更新 更多