Javascript 使用mock时的单元测试断言
我正在使用mock编写一个单元测试,并想征求意见。我的具体示例是模拟“窗口”对象,但是问题可能会出现在其他场景中 注意,我正在对单元测试进行反向工程,TDD是我们在这里采用的一种新样式 我正在测试的模块将返回URL的哈希部分并从中获取参数。例如,如果哈希值为:Javascript 使用mock时的单元测试断言,javascript,unit-testing,mocking,Javascript,Unit Testing,Mocking,我正在使用mock编写一个单元测试,并想征求意见。我的具体示例是模拟“窗口”对象,但是问题可能会出现在其他场景中 注意,我正在对单元测试进行反向工程,TDD是我们在这里采用的一种新样式 我正在测试的模块将返回URL的哈希部分并从中获取参数。例如,如果哈希值为: #param=value¶m2=value2 然后,模块将返回如下对象: { param: 'value', param2: 'value2' } 我正在编写的第一个单元测试是返回没有哈希的哈希值。方法如下:
#param=value¶m2=value2
然后,模块将返回如下对象:
{
param: 'value',
param2: 'value2'
}
我正在编写的第一个单元测试是返回没有哈希的哈希值。方法如下:
getCurrentHash: function() {
return window.location.hash.slice(1);
},
我模拟了window对象,将window.location.hash
设置为#param=value¶m2=value2
我希望getCurrentHash在这个特定实例中返回param=value¶m2=value2
窗口对象依赖于散列模块,我在运行测试时切换了路径以使用模拟版本
问题
单元测试是否应该针对模拟数据进行明确测试,如下所示:
tdd.test('getCurrentHash', function () {
var currentHash = hash.getCurrentHash();
currentHash.should.equal('param=value¶m2=value2');
});
tdd.test('getCurrentHash', function () {
var currentHash = hash.getCurrentHash();
currentHash.should.not.contain('#');
currentHash.should.be.a('string');
currentHash.should.have.length.above(0);
});
或者单元测试是否应该测试返回值的格式,如下所示:
tdd.test('getCurrentHash', function () {
var currentHash = hash.getCurrentHash();
currentHash.should.equal('param=value¶m2=value2');
});
tdd.test('getCurrentHash', function () {
var currentHash = hash.getCurrentHash();
currentHash.should.not.contain('#');
currentHash.should.be.a('string');
currentHash.should.have.length.above(0);
});
这个问题的产生是因为模拟可能会改变。例如,如果我们决定在模拟中添加空格,我们最终会将其修改为param=value¶m2=value2+withspace
。这将导致测试失败,我需要将测试更改为:
tdd.test('getCurrentHash', function () {
var currentHash = hash.getCurrentHash();
currentHash.should.equal('param=value¶m2=value2+withspace');
});
但是,在第二个测试更通用的情况下,我不需要更改单元测试
我读过一些文章,包括下面列出的那些,但是我找不到任何关于断言应该断言什么的详细推理
- 如果不存在has值,则不会返回任何内容(但不会返回任何错误(除非您明确希望这样做))
- 当值存在时,将返回预期值
getCurrentHash: function() {
return "bob";
}
这使得测试毫无用处。您的测试旨在验证系统的行为。因此,编写测试,设置愉快路径条件、故障情况和边缘情况,并让它们验证事情是否按照您期望的方式运行。这对于鼓励更多的工作对话非常有用。谢谢