模拟/存根是否启用了调试日志?

时间:2017-11-21 21:03:16

标签: unit-testing mocha sinon sinon-chai

如何编写允许我验证无法访问的属性(debugLog)设置为true的模拟测试?我是否试图找到找到该物业价值的方法?我是否验证console.debug已设置?在这种情况下,间谍是否有意义,还是应该使用存根?

X级

let showDebugLogs = false,
debugLog = _.noop

/**
 * Configures Class X instances to output or not output debug logs.
 * @param {Boolean} state The state.
 */
exports.showDebugLogs = function (state) {
    showDebugLogs = state;
    debugLog = showDebugLogs ? console.debug || console.log : _.noop;
};

单元测试

    describe('showDebugLogs(state)', function () {
        let spy;
        it('should configure RealtimeEvents instances to output or not output debug logs', function () {
            spy = sinon.spy(X, 'debugLog');
            X.showDebugLogs(true);
            assert.strictEqual(spy.calledOnce, true, 'Debug logging was not enabled as expected.');
            spy.restore();
        });
    });

1 个答案:

答案 0 :(得分:1)

模拟测试用于" isoloting"从其环境中测试的一个类,以减少其副作用并提高其测试能力。例如,如果您正在测试一个对Web服务器进行AJAX调用的类,那么您可能不希望:

1) wait for AJAX calls to complete (waste of time)
2) observe your tests fall apart because of possible networking problems
3) cause data modifications on the server side

等等。

所以你要做的是" MOCK"你的代码的一部分,它进行AJAX调用,并根据你的测试你:

1) return success and response accompanying a successful request
2) return an error and report the nature of the point of failure to see how your code is handing it.

对于您的情况,您需要的只是一个简单的单元测试用例。如果这是您真正想要的,您可以使用内省技术来断言对象的内部状态。但是,这会出现警告:不鼓励 请参阅底部的注释

应该进行单元测试以测试对象的行为或公共状态。所以,你真的不应该关心班级的内部。

因此,我建议您重新考虑一下您要测试的内容并找到更好的测试方法。

建议:您可以模拟记录器以进行测试,而不是检查班级中的标志。并编写至少两个测试用例如下:

1) When showDebugLogs = true, make sure log statement of your mock logger is fired
2) When showDebuLogs = false, log statement of your mock logger is not called. 

备注:两个学派之间一直存在争议:一个群体主张私人成员/方法是实施细节,应该 NOT 直接测试,另一个反对这个想法的团体:

Excerpt from a wikipedia article

  

TDD的从业者之间存在一些争论,记录在他们的文章中   博客和其他着作,关于测试私人是否明智   方法和数据无论如何。有些人认为私人成员仅仅是一个人   可能会改变的实施细节,应该允许这样做   没有打破测试数量。因此它应该足够了   通过其公共接口或通过其子类测试任何类   接口,有些语言称之为" protected"接口。[29]   其他人说可以实现功能的关键方面   私有方法和直接测试它们提供了更小的优势   更直接的单元测试