【问题标题】:Javascript Jasmine Testing: Prevent tested function to call function from object that was created within tested functionJavascript Jasmine 测试:防止被测函数从被测函数中创建的对象调用函数
【发布时间】:2015-04-29 11:33:52
【问题描述】:

我想用 Jasmine 测试一个 Javascript 函数,它的结构如下:

showEditUser: function (...) {
    // more code here...
    var editUserView = new EditUserView();
    // more code here...
    editUserView.generate(...);
}

editUserView.generate() 导致错误。没关系,因为我不想测试它。但是如何防止它被调用呢?

EditUserView 是一个 RequireJS 模块,它扩展了另一个名为 BaseView 的模块。函数generate()BaseView 中定义。还有其他扩展 BaseView 的模块,我希望它们都不要在测试时调用生成。我怎么能用茉莉花做到这一点? spyOn(...).and.callFake() 似乎不可能,因为调用函数时我没有 editUserView 对象。有没有一种静态的方式告诉 Jasmine callFake() BaseView 中的函数 generate

【问题讨论】:

  • 我对 Jasmine 不熟悉,但使用 Sinon 我想有人会使用存根。 sinonjs.org/docs/#stubs
  • 我认为 jasmine 只使用间谍。这和存根是一样的吗?我也认为用间谍解决这个问题是不可能的。
  • 间谍与存根不同。间谍只观察对原始函数的调用,而存根将完全替换原始函数。我想你可以在 jasmine 中使用 sinon,但不知道会有多混乱。

标签: javascript testing requirejs jasmine spy


【解决方案1】:

没有用茉莉花解决这个问题的“好”方法。我认为,将 BaseView viewObj 作为参数是一种更好的编码风格。它将减少方法的依赖性。所以它不必知道具体的BaseView-class,他只需要一个viewObj,它有一个generate-method。

showEditUser: function(..., viewObj) {
    // ...
    viewObj.generate(...);
}

然后您可以创建一个 ViewMock 并将其放入该函数中,如下所示:

var viewMock = {};
viewMock.generate = jasmine.createSpy('generate() spy');

那你就这样称呼它:

showEditUser(..., viewMock);

编辑:Here is a similar question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    相关资源
    最近更新 更多