我想在单元测试的函数中有以下代码行:
var myStore = Ext.data.StoreManager.lookup("MyStore");
我试图在我的单元测试中模拟商店,如下所示:
spyOn(Ext, 'data').and.returnValue({
StoreManager: {
lookup: function() {
return myMockStoreObjectForTestingPurposes;
}
}
});
但是,由于某种原因,单元测试试图使用Ext.data返回的真实对象而不是我的模拟对象。
任何人都知道为什么会这样吗?我应该以不同的方式嘲笑Ext.data.StoreManager吗?
答案 0 :(得分:1)
Jasmine正在期待数据'成为一个功能,它实际上是一个对象。
我可以在这里看到三种解决方案,最简单的方法是监视Ext.data.StoreManager,类似于:
spyOn(Ext.data.StoreManager, 'lookup').and.callFake(function() {
return myMockStoreObjectForTestingPurposes;
});
这实际上会用你的" fake"替换每个查询调用。功能
第二个是在测试中完全替换Ext对象,如:
beforeEach(
module('your-module-name', function ($provide) {
var mockedExt = {
data: {
StoreManager: {
lookup: function() {
return myMockStoreObjectForTestingPurposes;
}
}
}
};
$provide.value('Ext', mockedExt);
})
);
这是用mockedExt替换每次注入Ext
。
最后一个解决方案几乎与上面的解决方案相同,但是你直接将其传递给控制器(假设您正在测试控制器),例如:
beforeEach(
inject(function (_$controller_) {
var mockedExt = {
data: {
StoreManager: {
lookup: function() {
return myMockStoreObjectForTestingPurposes;
}
}
}
};
var myController = _$controller_('MyControllerName', {
Ext: mockedExt
});
})
);
希望有所帮助:)
答案 1 :(得分:0)
我相信你应该尝试使用and.callFake而不是and.returnValue,它应该返回你的模拟对象。如果我是对的,你可以在这里阅读更多内容:
http://jasmine.github.io/2.0/introduction.html
祝你好运。