0

如何编写允许我验证不可访问属性 ( 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();
        });
    });
4

1 回答 1

1

模拟测试用于将被测类从其环境中“隔离”出来,以减少其副作用并提高其测试能力。例如,如果您正在测试一个对 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

等等。

所以你要做的是“模拟”你的代码的一部分,它会进行 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. 

注意:两派之间一直存在着长期的争论:一组主张私有成员/方法是实现细节,应该直接测试,另一组反对这个想法:

摘自维基百科文章

TDD 的从业者之间存在一些争论,在他们的博客和其他著作中都有记录,关于无论如何测试私有方法和数据是否明智。一些人认为私有成员只是一个可能会改变的实现细节,应该允许这样做而不会破坏测试数量。因此,通过其公共接口或通过其子类接口(某些语言将其称为“受保护”接口)测试任何类就足够了。 [29] 其他人说,功能的关键方面可以在私有方法中实现,直接测试它们提供了更小、更直接的单元测试的优势

于 2017-11-21T21:20:39.447 回答