Angularjs Jasmine每个规范的多个预期与每个规范的单个预期

Angularjs Jasmine每个规范的多个预期与每个规范的单个预期,angularjs,jasmine,Angularjs,Jasmine,我开始使用Jasmine来测试angularjs,但很快我开始想知道哪种方法是好的,为什么?我选择了单一的expect per spec。我喜欢它,因为非技术人员可以更好地理解它,这就是BDD的重点,不是吗?比如说 describe('Testing multple expect per spec My Service', function() { beforeEach(/* some stuff*/); it('test part ',function(){ expect

我开始使用Jasmine来测试angularjs,但很快我开始想知道哪种方法是好的,为什么?我选择了单一的expect per spec。我喜欢它,因为非技术人员可以更好地理解它,这就是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
         }
}
但很快就遇到了麻烦,我意识到beforeach实际上正在重置/创建我的服务的新对象(上面的示例中没有显示),因此封装的行为没有正确反映

例如,我正在测试注入服务的firstMethod()部分,它更改了服务的数据结构“test part 1”,然后在第二个规范中,我正在测试secondMethod(),它测试“test part 2”中的更改数据结构。但由于在每次重新注入我的服务之前,“测试第二部分”都失败了。我怎样才能避开这种情况


请在这里帮助Jasmine新手。

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

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


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

为了您的理解,每个规范都是孤立的(beforeach中的新对象),其原因是允许多线程。许多规格可以同时运行(订单并不重要)。从测试设计的角度来看,为什么这是一个好主意,请参见答案。有趣的是,如果jasmine在基于浏览器的测试用例中运行,多线程是如何产生的?测试运行程序本身必须这样做(Karma、Chutzpah等)。不确定是否/哪些是真的-可能很少。分离的主要原因是更好的测试设计(如答案中所解释的)-并发只是一个可能的副作用,因为该框架。还应该注意,每个规范的多个预期本身没有什么错,只要它们验证相同的“行为”。例如,可以将“长度大于4的字符串的方法应返回true”设置为单个规范,预期长度为3、4和5,而不是3个不同的规范。