Jasmine 多期望每个规格 vs 单个期望每个规格

Abh*_*hra 6 jasmine angularjs

我开始使用 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
         }
}
Run Code Online (Sandbox Code Playgroud)

但很快就遇到了麻烦,我意识到 beforeEach 实际上是在重置/创建我的服务的一个新对象(上面的例子中没有显示),因此封装的行为没有正确反映。

例如,我正在测试一个注入服务的 firstMethod() 部分,它改变了服务的数据结构,“测试第一部分”,然后在第二个规范中,我正在测试 secondMethod() ,它在'测试第二部分'。但是由于 beforeEach 重新注入我的服务,“测试第二部分”失败了。我怎样才能解决这种情况?

请在这里帮助茉莉花新手。

she*_*lak 5

你的单元测试应该相互独立。否则,如果测试 2 失败,您不知道方法 2 中是否存在问题,或者方法 1 中完成的设置是否存在问题。

为了处理这种情况,您可以在测试 2 开始时进行一些额外的设置,确保服务处于测试方法 2 中的逻辑所需的任何状态。如果多个测试需要该设置,您可以将其放入一个嵌套的describebeforeEach

正如@ktharsis 指出的那样,只要每个规范验证相同的“行为”,就可以对每个规范进行多个期望。每个测试都应该对应一种行为,而不一定是一种断言。

  • 还应该注意的是,只要每个规范验证相同的“行为”,每个规范的多个期望并没有本质上的错误。例如,“对于长度超过 4 的字符串,方法应该返回 true”可以设置为单个规范,期望长度为 3、4 和 5,而不是 3 个不同的规范。 (3认同)