2017-06-19 118 views
0

我有多个使用共享基础文件(称为testBase.js)的Mocha测试文件。它负责建立所有的存根和间谍。具有多个摩卡测试文件的Sinon

如果我运行通过摩卡个人文件中的所有测试用例通过但当它贯穿摩卡测试* .js文件,测试案例开始出现故障,提高错误

TypeError: Attempted to wrap send which is already wrapped 

这里是我的beforeEach和afterEach块

beforeEach(function (done) { 
    context.alexaSpy = sinon.spy(alexa, "send"); 
} 

beforeEach(function (done) { 
    context.alexaSpy.restore(); 
} 

我实际上在两个块中打印出日志,并且发现了一件奇怪的事情。我看到这样的日志

-- BeforeEach Fired Test1 
-- BeforeEach Fired Test1 
-- AfterEach Fired Test1 
-- AfterEach Fired Test1 

我不知道为什么它调用两次,它的问题的根本原因。一次摩卡测试时,BefireEach不能拨打两次电话。

是否在导入多个文件之前调用两次?有人可以提出任何可能的解决方案吗?我也尝试sinon.sandbox,但它不起作用

+1

是'beforeEach'和'afterEach'位于* testBase *文件的根目录?或者他们被封装在一个函数中并以某种方式导出?请提供更多信息。 – vsenko

+0

这两个函数都位于基本文件中,它们在testInit函数中,然后导出到测试用例 –

+0

您需要导出纯函数 - 未包含beforeEach和afterEach。然后将它们传递到beforeEach和afterEach中的每个文件的描述块中。否则,你会有错误,因为它们都适用于外部(全局)范围。我在我的答案的底部描述了这一点 – oligofren

回答

0

我们需要了解您在基础文件中的确定方式。

我的猜测很简单,就是你需要从多个文件中获取文件,每次你做这些时,你都要添加setup和teardown函数。发生这种情况是因为所有测试共享相同的外部范围。要求Base文件十次将会添加beforeEach十次。

正确的做法是使用sinon.sandbox或sinon-test。更容易避免一个测试干扰下一个测试。

但是不管你做什么,你就需要导出的功能和运行在beforeEach在每个文件

通常这样

const base = require('./base') 

describe('module one',()=> { 
    beforeEach(base.commonStubs); 

    it('should.... ',..); 
})