2015-06-08 21 views
5

Tôi muốn thử nghiệm ứng dụng góc cạnh của tôi với Jasmine. Vì vậy, tôi đã tạo một số thử nghiệm, hầu hết chúng hoạt động tốt. Nhưng, một trong các chức năng của tôi yêu cầu người dùng điền vào một lời nhắc. Thử nghiệm không thể điền lời nhắc này, vì vậy tôi đã chế nhạo chúng bằng spyOn(window,'prompt').and.returnValue('test'). Điều này hoạt động, nhưng chỉ một lần.Jasmine spyOn với nhiều lợi nhuận

Khi tôi thêm hai thành phần của mình (chức năng có lời nhắc), tôi muốn spyOn lời nhắc đầu tiên với kết quả 'kiểm tra' và dấu nhắc thứ hai với 'test2'. Tôi đã cố gắng làm điều này như sau:

it 'should place the component as last object in the form', -> 

     spyOn(window, 'prompt').and.returnValue('test') 
     builder.addFormObject 'default', {component: 'test'} 

     spyOn(window, 'prompt').and.returnValue('test2') 
     builder.addFormObject 'default', {component: 'test2'} 

     expect(builder.forms['default'][0].name).toEqual('test') 

Nhưng điều này mang đến cho các lỗi sau: Error: prompt has already been spied upon này là khá hợp lý, nhưng tôi không biết một cách khác để trở về với một spyOn.

Vì vậy, điều tôi muốn là: Trước khi addFormObject đầu tiên, tôi muốn theo dõi lời nhắc trả về 'thử nghiệm'. Và addFormObject thứ hai tôi muốn để do thám với sự trở lại 'test2'

Trả lời

1

Với spyOn bạn có thể quay trở lại giá trị chế giễu và đặt nó tự động như trong đoạn mã sau

it 'should place the component as last object in the form', -> 
    mockedValue = null 

     spyOn(window, 'prompt').and.returnValue(mockedValue) 
     mockedValue = 'test' 
     builder.addFormObject 'default', {component: 'test'} 

     mockedValue = 'test2' 
     builder.addFormObject 'default', {component: 'test2'} 

     expect(builder.forms['default'][0].name).toEqual('test') 
2

But this gives the following error: Error: prompt has already been spied upon

Cách đúng để làm điều đó cũng giống như rằng:

var spy = spyOn(window, 'prompt'); 

... 
spy.and.returnValue('test') 

... 
spy.and.returnValue('test2') 
1

Vì hoa nhài v2.5, hãy sử dụng cài đặt toàn cầu allowRespy().

jasmine.getEnv().allowRespy(true);

Bạn sẽ có thể gọi spyOn() nhiều lần, khi bạn không muốn và/hoặc có quyền truy cập vào các điệp viên đầu tiên. Hãy coi chừng nó sẽ trả về điệp viên trước đó, nếu có bất kỳ hoạt động nào đã hoạt động.

spyOn(window, 'prompt').and.returnValue('test') 
 
... 
 
spyOn(window, 'prompt').and.returnValue('test')

Các vấn đề liên quan