nodejs - 测试失败但调用回调

时间:2017-03-07 10:37:31

标签: node.js unit-testing mocha sinon chai

我有一个导出的模块,其中有一个m@containment*[ |java+package:///elib|]方法,我尝试使用rascal> import analysis::graphs::Graph; // or import Graphs; in older versions ok rascal> top(m@containment) set[loc]: { |java+package:///org|, |java+package:///vinju| } editHeroImagemocha进行测试。这些模块有两个作为参数传递的对象chaisinon。这些是connection个对象,一个包含与数据库的连接,另一个包含在各自模块中定义的查询字符串。我正在导出并尝试测试的queries是一个“帮助”模块。

我已经成功测试了此模块的其他方法,就像我尝试测试此方法一样,但是,当我遇到因某些原因使用mySql模块的方法时,我的测试不再表现正如所料。我想知道在这种特殊情况下我是否遗漏了一些内容,因为我已经测试了其他模块和方法,这些模块和方法也使用了expObj并且没有遇到过这种行为。

当我运行测试时,它会记录“你好!”正如预期的那样,async被调用的断言失败了。

我在这里失去理智!请帮忙!到底是怎么回事?试衣服之间会有污染吗?

待测方法:

async

测试,设置:

callbackSpy

2 个答案:

答案 0 :(得分:1)

您的断言可能在您的异步函数返回之前执行。

有许多方法可以确保您的异步功能已完成执行。最干净的是以不同方式格式化你的摩卡测试。

describe('...', function () {
    var callbackSpy;

    before(function () {
        var _post = {
            id: '123',
            title: 'vf',
            sub_title: 'vf',
            slug: 'vf',
            reading_time: 4,
            created_at: '123',
            published_at: '123',
            deleted_on: false,
            hero_image: 'hero_image_path'
        };
        var _postId = '123';
        queryStub.onCall(0).callsArgWith(2, null, [{
            hero_image: '55'
        }]);
        queryStub.onCall(1).callsArgWith(2, null);
        queryStub.onCall(2).callsArgWith(2, null);

        return testedModule.editHeroImage(connectionStub, fakeQueriesObj, _postId, _post, function () {
            console.log(arguments); // --> {'0': null} as expected
            callbackSpy.apply(null, arguments);
        });
    });

    it('edits hero image', function () {
        expect(callbackSpy).has.been.calledWith(null);
    });
});

请注意,我已将您的断言包装在describe块中,因此我们可以使用before。您设置存根和执行类的实际逻辑已移至before块并添加了一个返回,这可确保在继续执行断言之前完成异步功能。

您的其他测试可能已经通过,但他们也会对此感到敏感,这纯粹是一个时间问题。

答案 1 :(得分:0)

事实上,@ Varedis认为这是一个时间问题。但是,使用您在describe bloack中包装断言并使用before函数设置测试的建议导致我的存根不再正常工作。然而,考虑到您对时间安排的建议,我设法通过在我的测试套装中使用完成回调来解决问题。通过保持设置,我做了一个小小的改变,我的测试突然通过了:

it('edits hero image', function(done) {
    var _post = {
      id: '123',
      title: 'vf',
      sub_title: 'vf',
      slug: 'vf',
      reading_time: 4,
      created_at: '123',
      published_at: '123',
      deleted_on: false,
      hero_image: 'hero_image_path'
    };
    var _postId = '123';
    queryStub.onCall(0).callsArgWith(2, null, [{hero_image: '55'}]);
    queryStub.onCall(1).callsArgWith(2, null);
    queryStub.onCall(2).callsArgWith(2, null);
    testedModule.editHeroImage(connectionStub, fakeQueriesObj, _postId, _post, function() {
      callbackSpy.apply(null, arguments);
      expect(callbackSpy).has.been.calledWith(null);
      expect(callbackSpy).has.not.been.calledWith('FDgdjghg');
      done();
    });
  });