Javascript Jasmine 测试:防止测试函数从在测试函数中创建的对象调用函数
Javascript Jasmine Testing: Prevent tested function to call function from object that was created within tested function
我想用具有如下结构的 Jasmine 测试一个 Javascript 函数:
showEditUser: function (...) {
// more code here...
var editUserView = new EditUserView();
// more code here...
editUserView.generate(...);
}
editUserView.generate()
导致错误。那没关系,因为我不想测试它。但是如何防止它被调用呢?
EditUserView
是一个 RequireJS 模块,它扩展了另一个名为 BaseView
的模块。函数 generate()
在 BaseView
中定义。还有其他扩展 BaseView
的模块,我希望它们在测试时都不要调用生成。我怎样才能用 Jasmine 做到这一点? spyOn(...).and.callFake()
似乎不可能,因为我在调用函数时没有 editUserView
对象。有没有一种静态方法告诉 Jasmine callFake()
BaseView
中的函数 generate
?
没有 "nice" 方法可以用 jasmine 解决这个问题。我认为,将 BaseView viewObj
作为参数是一种更好的编码风格。它将减少方法的依赖性。所以它不需要知道具体的 BaseView
-class,他只需要一个 viewObj
有一个 generate
-method.
showEditUser: function(..., viewObj) {
// ...
viewObj.generate(...);
}
然后你可以创建一个 ViewMock 并将其放入该函数中,如下所示:
var viewMock = {};
viewMock.generate = jasmine.createSpy('generate() spy');
那么你会这样称呼它:
showEditUser(..., viewMock);
编辑:
我想用具有如下结构的 Jasmine 测试一个 Javascript 函数:
showEditUser: function (...) {
// more code here...
var editUserView = new EditUserView();
// more code here...
editUserView.generate(...);
}
editUserView.generate()
导致错误。那没关系,因为我不想测试它。但是如何防止它被调用呢?
EditUserView
是一个 RequireJS 模块,它扩展了另一个名为 BaseView
的模块。函数 generate()
在 BaseView
中定义。还有其他扩展 BaseView
的模块,我希望它们在测试时都不要调用生成。我怎样才能用 Jasmine 做到这一点? spyOn(...).and.callFake()
似乎不可能,因为我在调用函数时没有 editUserView
对象。有没有一种静态方法告诉 Jasmine callFake()
BaseView
中的函数 generate
?
没有 "nice" 方法可以用 jasmine 解决这个问题。我认为,将 BaseView viewObj
作为参数是一种更好的编码风格。它将减少方法的依赖性。所以它不需要知道具体的 BaseView
-class,他只需要一个 viewObj
有一个 generate
-method.
showEditUser: function(..., viewObj) {
// ...
viewObj.generate(...);
}
然后你可以创建一个 ViewMock 并将其放入该函数中,如下所示:
var viewMock = {};
viewMock.generate = jasmine.createSpy('generate() spy');
那么你会这样称呼它:
showEditUser(..., viewMock);
编辑: