如何在我的测试类/方法中加载的对象中存根方法?

时间:2018-02-22 09:04:47

标签: javascript unit-testing tdd sinon sinon-chai

我们的MEANJS应用程序有一个类(例如,CompanyService),它加载另一个类的对象(例如,CompanyRepo)并在其上调用方法。我正在尝试为CompanyService类编写单元测试,并且需要在CompanyRepo方法中存根方法来模拟承诺拒绝。但是,尽管存根,CompanyService方法调用似乎调用了实际的CompanyRepo方法调用。

代码流程如下,

companyService方法

function isDomainExists(domain) {
    return new Promise(function(resolve, reject) {
        companyRepo.getCompanyByDomain(domain)
                .then(function (company) {
                    return resolve(company);
                }, function(rejected) {
                    return reject("Error");
                })
    } });

单元测试方法

var stub = sinon.stub(companyRepo,"getCompanyByDomain").rejects("error"); it('Should return company not registered if there is a DB error', function() {
    return companyService.isDomainExists("test company").should.eventually.be.rejected(); }); stub.restore();

输出

  

公司服务          isDomainExists方法            如果出现数据库错误,应该返回公司未注册:        AssertionError:预期的承诺被拒绝,但它是通过{Object($ __,isNew,...)}

实现的。

我想我能理解这里发生的事情。 companyService类有一个require语句,用于加载companyRepo类,该类甚至在发生存根之前就会执行。有什么方法可以避免这种情况发生吗?在这种情况下,建议的最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

我无法让它与should一起正常工作,但确实让它发挥作用,看看是否有帮助:

companyService:

var companyRepo = require('./companyRepo');

function isDomainExists(domain) {
    return new Promise(function (resolve, reject) {
        companyRepo.getCompanyByDomain(domain)
            .then(function (company) {
                console.log('----in main resolve')
                return resolve(company);
            }, function (rejected) {
                console.log('----in error catch')
                // return reject(new Error('Errorx'));
                return reject('Error');
            });
    });
};

exports.isDomainExists = isDomainExists;

companyRepo

exports.getCompanyByDomain = () => { 
    console.log('-----in real getCompanyByDomain');

    return Promise.resolve('resolve from real function');
}

测试

it('Should return company not registered if there is a DB error', async function () {
    var stub = sinon.stub(companyRepo, "getCompanyByDomain").rejects("fake_error");

    await expect(companyService.isDomainExists("test company")).to.eventually.be.rejectedWith('Error');

    stub.restore();
});

拒绝错误(而不是假冒错误)因为您的拒绝功能发送错误'无论。

有时应该表现得很有趣,不知道为什么还要尝试在测试中移动存根/ resotre(或者在beforeEach,afterEach之后)。

在公司的Repo定义中也有一个小错字。

如果没有其他工作(我在某些情况下已经看过这种情况),请尝试重新连接到存根:

var rewire = require('rewire')
//notice not using require here
var companyService = rewire('./companyService');

it('should stub', async () => {
    let fake = {
        getCompanyByDomain: () => {
            console.log('------rewired stub')
            return Promise.reject('rewired_error');
        }
    }

    companyService.__set__('companyRepo', fake);

    await expect(companyService.isDomainExists("test company")).to.eventually.be.rejectedWith('Error');
    //reset
    companyService = rewire('./companyService');
});