所以读完之后这个帖子 https://groups.google.com/forum/?fromgroups#!topic/requirejs/UuRL0wQwRRw我想出了一个解决方案,使用 requirejs 配置函数为您的测试创建一个新的上下文,您可以在其中简单地模拟您的依赖项:
var cnt = 0;
function createContext(stubs) {
cnt++;
var map = {};
var i18n = stubs.i18n;
stubs.i18n = {
load: sinon.spy(function(name, req, onLoad) {
onLoad(i18n);
})
};
_.each(stubs, function(value, key) {
var stubName = 'stub' + key + cnt;
map[key] = stubName;
define(stubName, function() {
return value;
});
});
return require.config({
context: "context_" + cnt,
map: {
"*": map
},
baseUrl: 'js/cfe/app/'
});
}
因此它创建了一个新的上下文,其中定义Hurp
and Durp
将由您传递给函数的对象设置。 Math.random 这个名字可能有点脏,但它确实有效。因为如果您需要进行大量测试,则需要为每个套件创建新的上下文,以防止重复使用您的模拟,或者在需要真正的 requirejs 模块时加载模拟。
在你的情况下,它看起来像这样:
(function () {
var stubs = {
hurp: 'hurp',
durp: 'durp'
};
var context = createContext(stubs);
context(['yourModuleName'], function (yourModule) {
//your normal jasmine test starts here
describe("yourModuleName", function () {
it('should log', function(){
spyOn(console, 'log');
yourModule.foo();
expect(console.log).toHasBeenCalledWith('hurp');
})
});
});
})();
所以我在生产中使用这种方法一段时间了,它非常强大。