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);

编辑: