【问题标题】:Is there any way to mock this function with Jasmine or Sinon?有没有办法用 Jasmine 或 Sinon 模拟这个功能?
【发布时间】:2012-03-22 03:09:31
【问题描述】:

我正在测试一个模块,我想模拟出该模块中的一个依赖项。如果可以的话,让我构想一下我的情景:

在我的模块中

myModule.prototype.func = function(callback) {
    complexObj.doStuff('foo', function(err) {
        callback(err, 'stuff');
    });
};

所以,我基本上是在模拟 complexObj。在这种情况下,我是模拟整个对象还是只模拟 doStuff 函数并不重要。让我们假设doStuff 做了一些类似于与 Web 服务或文件系统交互的事情。 complexObj 正在通过依赖注入注入myModule。我一直在使用 Jasmine 和 Sinon 尝试模拟或存根这个对象和函数,但我没有运气,所以我求助于这样的东西,这似乎有点笨拙:

在我的规范中:

describe('Testing myModule', function() {
    it('should do stuff', function() {
        ComplexObj.prototype.doStuff = function(arg, callback) {
            callback(null); // If no errors, 'doStuff' returns null indicating no errors
        };

        var complexObj = new ComplexObj();

        new myModule(complexObj).func(function(err, results) {
            // Set up expectations...
        });
    });
});

所以,如您所见,我是 psuedo - 模拟 doStuff 对象中的 doStuff 函数。因为我不关心ComplexObjdoStuff 函数,所以我只是调用带有'null' 的回调,指示funcdoStuff 中没有错误。正如我之前提到的,我觉得应该有更好的方法来处理这个问题?有什么建议吗?

【问题讨论】:

    标签: node.js mocking


    【解决方案1】:

    使用 Jasmine,您可以执行以下操作:

    var complexObj = {doStuff: null};
    spyOn(complexObj, 'doStuff');
    new myModule(complexObj).func(function(err, results) {
        expect(complexObj.doStuff).toHaveBeenCalledWith(args, callback);
    });
    

    编辑:或者你可以在你的嘲笑doStuff中设置期望:

    var complexObj = {doStuff: null};
    spyOn(complexObj, 'doStuff').andCallFake(function(args, callback) {
        expect(args).toEqual(/*...*/);
        expect(callback).toEqual(/*...*/);
        callback();
    });
    new myModule(complexObj).func(function(err, results) {
        expect(complexObj.doStuff).toHaveBeenCalled();
    });
    

    【讨论】:

    • 在模拟假中expect 是最佳做法吗?我会假设由于从未调用过doStuff 而不会执行期望,这将导致错误的假设。我倾向于将 var 设置为 fake 并在调用该函数后期待该 var 上的内容。
    猜你喜欢
    • 2019-07-22
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多