【发布时间】:2015-08-13 18:45:45
【问题描述】:
我开始使用 Jasmine 进行测试,angularjs,但很快我开始想知道哪种方法好,为什么?我选择了每个规范的单一期望。我喜欢它,因为非技术人员可以更好地理解它,嗯,这就是 BDD 的重点,不是吗?例如
describe('Testing multple expect per spec My Service', function() {
beforeEach(/* some stuff*/);
it('test part ',function(){
expect('part 1').toBe('part one'); //
expect('part 2').toBe('part two'); // some crazy stuff, just for example
}
}
describe('Testing single expect per spec My Service', function() {
beforeEach(/* some stuff*/);
it('test part one ',function(){
expect('part 1').toBe('part one'); // just for example
}
it('test part two ',function(){
expect('part 2').toBe('part two'); // just for example
}
}
但很快就遇到了麻烦,我意识到 beforeEach 实际上是在重置/创建我的服务的新对象(在上面的示例中未显示),因此封装的行为没有正确反映。
例如,我正在测试注入服务的 firstMethod() 部分,它会更改服务的数据结构,“测试部分一”,然后在第二个规范中,我正在测试 secondMethod(),它测试更改数据“测试第二部分”中的结构。但是由于 beforeEach 重新注入了我的服务,“测试第二部分”失败了。我该如何解决这种情况?
请在这里帮助 Jasmine 新手。
【问题讨论】:
-
为了您的理解 - 每个规范被隔离(beforeEach 中的新对象)的原因是允许多线程。许多规范可以同时运行(顺序无关紧要)。从测试设计的角度来看,为什么这是一个好主意,请参阅答案。
-
有趣,如果 jasmine 在基于浏览器的测试用例中运行,多线程是如何进来的?
-
测试运行者本身必须这样做(Karma、Chutzpah 等)。不确定是否/哪个实际上可以 - 可能很少。分离的主要原因是更好的测试设计(如答案中所述)-并发只是由于该框架而可能产生的副作用。