【问题标题】:Jasmine multi expect per spec vs single expect per specJasmine 每个规格的多重预期与每个规格的单一预期
【发布时间】: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 等)。不确定是否/哪个实际上可以 - 可能很少。分离的主要原因是更好的测试设计(如答案中所述)-并发只是由于该框架而可能产生的副作用。

标签: angularjs jasmine


【解决方案1】:

您的单元测试应该相互独立。否则,如果测试 2 失败,您不知道是方法 2 有问题,还是方法 1 中的设置有问题。

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

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

【讨论】:

  • 还应该注意,只要它们验证相同的“行为”,每个规范的多个期望本质上并没有错。例如,“方法应该为超过 4 的字符串返回 true”可以设置为单个规范,期望长度为 3、4 和 5,而不是 3 个不同的规范。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
相关资源
最近更新 更多