【问题标题】:How can you reset Knockout for each Jasmine test?如何为每个 Jasmine 测试重置 Knockout?
【发布时间】:2015-01-30 19:18:02
【问题描述】:

我有一些使用在 HTML 中具有一些 Knockout 绑定的夹具(加载了 jasmine-jquery)运行的功能测试。在每个测试开始时,我想从处于初始状态的 viewModel 开始。

如果我在 beforeEach() 中使用 viewModel 的新实例调用 applyBindings(),我会从 Knockout 收到此错误

错误:您不能对同一个元素多次应用绑定。

如果我尝试恢复现有 viewModel 的属性以匹配其初始状态,我仍然会收到错误消息。我相信这是因为每次测试后都会删除夹具的 HTML - 这可能会破坏绑定?

我还尝试了came up when Googling 的建议,即在 Knockout 中使用 cleanNode 函数。这不是 API 的一部分(它仅设计用于 Knockout 内部使用),无论我尝试什么都没有解决问题。

感觉我对此采取了错误的方法。 tl;博士;其他人如何使用 Jasmine 测试 Knockout?

感谢您的帮助

【问题讨论】:

  • 你为什么要问类似的问题? stackoverflow.com/questions/27247822/… 如果您有更多内容要添加和删除另一个,只需编辑其中一个即可。
  • 另一个问题非常具体。这是一个关于测试 Knockout 的模式的更开放的问题。
  • 是的,两者的背景故事都是一样的。但我提出了两个不同的问题,并期待不同的答案。

标签: javascript jquery mvvm knockout.js jasmine


【解决方案1】:

我通常在beforeEach 中附加一个元素,将绑定应用到该元素,并在afterEach 中对它应用ko.removeNode。比如:

            var fixture;

            beforeEach(function() {
                fixture = document.createElement("div");
                document.body.appendChild(fixture);
            });

            afterEach(function() {
                ko.removeNode(fixture);
            });

然后使用 fixture 作为任何 applyBindings 调用的第二个参数,例如:ko.applyBindings(myTestViewModel, fixture);

【讨论】:

  • 像魅力一样工作。谢谢
【解决方案2】:

我解决这个问题的方法是改变我的 js 来检查茉莉花,例如:

if (!window.jasmine)
   ko.applyBindings(viewModel);

【讨论】:

  • 这看起来您正在修改生产代码以修复您的测试?除非我错过了什么,RP Niemeyer 建议的解决方案要好得多。
  • 我想我遗漏了一些东西,但是当我尝试 RP Niemeyer 的解决方案时,它不起作用。 ko.applyBindings(myTestViewModel, fixture) 应该在哪里,因为我的 applyBindings 只存在于带有 viewmodel 的 js 文件中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 2014-08-07
  • 1970-01-01
  • 2020-06-29
  • 2014-09-30
  • 2013-12-24
  • 2016-12-27
相关资源
最近更新 更多