Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用mock时的单元测试断言_Javascript_Unit Testing_Mocking - Fatal编程技术网

Javascript 使用mock时的单元测试断言

Javascript 使用mock时的单元测试断言,javascript,unit-testing,mocking,Javascript,Unit Testing,Mocking,我正在使用mock编写一个单元测试,并想征求意见。我的具体示例是模拟“窗口”对象,但是问题可能会出现在其他场景中 注意,我正在对单元测试进行反向工程,TDD是我们在这里采用的一种新样式 我正在测试的模块将返回URL的哈希部分并从中获取参数。例如,如果哈希值为: #param=value&param2=value2 然后,模块将返回如下对象: { param: 'value', param2: 'value2' } 我正在编写的第一个单元测试是返回没有哈希的哈希值。方法如下:

我正在使用mock编写一个单元测试,并想征求意见。我的具体示例是模拟“窗口”对象,但是问题可能会出现在其他场景中

注意,我正在对单元测试进行反向工程,TDD是我们在这里采用的一种新样式

我正在测试的模块将返回URL的哈希部分并从中获取参数。例如,如果哈希值为:

#param=value&param2=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&param2=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&param2=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&param2=value2+withspace');
});
但是,在第二个测试更通用的情况下,我不需要更改单元测试

我读过一些文章,包括下面列出的那些,但是我找不到任何关于断言应该断言什么的详细推理


您想测试您想从正在测试的东西中看到的行为。您的行为是(基于实现)返回窗口位置哈希值减去“#”字符。因此,您应该测试以下内容:

  • 如果不存在has值,则不会返回任何内容(但不会返回任何错误(除非您明确希望这样做))
  • 当值存在时,将返回预期值
您的第二个测试对IMHO没有什么价值,因为我可以将实现更改为此,并且测试仍然会通过

getCurrentHash: function() {
    return "bob";
}

这使得测试毫无用处。您的测试旨在验证系统的行为。因此,编写测试,设置愉快路径条件、故障情况和边缘情况,并让它们验证事情是否按照您期望的方式运行。

这对于鼓励更多的工作对话非常有用。谢谢