2013-12-16 24 views
8

Tôi đang trải qua một ứng dụng và thêm Bài kiểm tra Đơn vị. Ứng dụng này được viết bằng bảng phân cảnh và hỗ trợ iOS 6.1 trở lên.Kiểm tra nếu performSegueWithIdentifier được gọi trong phương thức bộ điều khiển chế độ xem

Tôi đã có thể kiểm tra tất cả các phương thức trả lại thông thường mà không gặp vấn đề gì. Tuy nhiên tôi hiện đang bối rối với một thử nghiệm nào đó tôi muốn thực hiện:

Về cơ bản tôi có một phương pháp, cho phép gọi nó là doLogin:

- (IBAction)doLogin:(UIButton *)sender { 

// Some logic here 

if (//certain criteria to meet) { 
    variable = x; // important variable set here 
    [self performSegueWithIdentifier:@"memorableWord" sender:sender]; 
} else { 
    // handler error here 
} 

Vì vậy, tôi muốn kiểm tra rằng một trong hai segue được gọi và rằng biến được thiết lập, hoặc bộ điều khiển xem MemorableWord được nạp và các biến trong đó là chính xác. Biến được đặt ở đây trong phương thức doLogin được chuyển qua bộ điều khiển xem đích đến đáng nhớ trong phương thức prepareForSegue.

Tôi đã thiết lập và hoạt động OCMock và tôi cũng đang sử dụng XCTest làm khung kiểm tra đơn vị của mình. Có ai đã có thể sản xuất một bài kiểm tra đơn vị để bao gồm một tình huống như vậy ??

Dường như Google và SO khá trống về thông tin xung quanh khu vực này .. rất nhiều ví dụ về các thử nghiệm cơ bản đơn giản không liên quan đến thực tế phức tạp hơn trong thử nghiệm iOS.

Trả lời

4

Bạn đang đi đúng hướng, kiểm tra của bạn muốn kiểm tra xem:

  1. Khi nút đăng nhập được khai thác doLogin được gọi với loginButton là người gửi
  2. Nếu một số tiêu chí là CÓ, cuộc gọi performSegue

Vì vậy, bạn thực sự cần kích hoạt đầy đủ các dòng chảy từ nút đăng nhập xuống performSegue:

- (void)testLogin { 
    LoginViewController *loginViewController = ...; 
    id loginMock = [OCMockObject partialMockForObject:loginViewController]; 

    //here the expect call has the advantage of swallowing performSegueWithIdentifier, you can use forwardToRealObject to get it to go all the way through if necessary 
    [[loginMock expect] performSegueWithIdentifier:@"memorableWord" sender:loginViewController.loginButton]; 

    //you also expect this action to be called 
    [[loginMock expect] doLogin:loginViewController.loginButton]; 

    //mocking out the criteria to get through the if statement can happen on the partial mock as well 
    BOOL doSegue = YES; 
    [[[loginMock expect] andReturnValue:OCMOCK_VALUE(doSegue)] criteria]; 

    [loginViewController.loginButton sendActionsForControlEvents:UIControlEventTouchUpInside]; 

    [loginMock verify]; [loginMock stopMocking]; 
} 

Bạn sẽ cần phải triển khai thuộc tính cho "tiêu chí" để có trình thu thập dữ liệu bạn có thể giả sử bằng 'mong đợi'.

Điều quan trọng của nó là nhận ra rằng 'mong đợi' sẽ chỉ loại bỏ 1 lệnh gọi tới getter, các cuộc gọi tiếp theo sẽ thất bại với "Phương thức bất ngờ được gọi ...". Bạn có thể sử dụng 'stub' để giả lập nó cho tất cả các cuộc gọi nhưng điều này có nghĩa là nó sẽ luôn trả về cùng một giá trị.

2

IMHO đây có vẻ là một kịch bản thử nghiệm có not properly được thiết lập.

Với kiểm tra đơn vị bạn chỉ nên test units (phương pháp ví dụ duy nhất) của ứng dụng của bạn. Các đơn vị đó phải là independent từ tất cả các phần khác của đơn đăng ký của bạn. Điều này sẽ đảm bảo với bạn rằng một chức năng duy nhất được kiểm tra đúng cách mà không có bất kỳ tác dụng phụ nào. BTW: OCMock là công cụ tuyệt vời để "giả lập" tất cả các phần bạn không muốn kiểm tra và do đó tạo ra các hiệu ứng phụ.

Nói chung thử nghiệm của bạn có vẻ là giống như một hội nhập thử nghiệm

IT is the phase of software testing, in which individual software modules are combined and tested as a group.

Vì vậy, những gì tôi sẽ làm gì trong trường hợp của bạn:

tôi sẽ hoặc là xác định một thử nghiệm hội nhập, nơi tôi sẽ kiểm tra đúng tất cả các bộ phận của quan điểm của tôi và do đó gián tiếp kiểm tra điều khiển quan điểm của tôi. Hãy xem xét một khuôn khổ thử nghiệm tốt cho loại trường hợp này - KIF

Hoặc tôi sẽ thực hiện các thử nghiệm đơn vị về phương thức 'doLogin' cũng như phương pháp tính toán tiêu chí trong câu lệnh if của bạn. Tất cả phụ thuộc cần được chế giễu ra có nghĩa là trong vòng thử nghiệm doLogin của bạn, thậm chí bạn nên thử phương pháp tiêu chuẩn ...

+0

Xin cảm ơn, nhưng đây chính xác là những gì tôi đang muốn làm. Tôi đang cố gắng thử nghiệm phương thức doLogin mà không cần và phụ thuộc vào bất kỳ thứ gì khác. ví dụ, như một trong các bài kiểm tra của tôi, tôi muốn đảm bảo rằng phương thức sẽ thực sự gọi hàm performSegueWithIdentifier khi các tiêu chí được đáp ứng. Tôi cũng sẽ kiểm tra xem lỗi có được xử lý đúng khi không. Vấn đề của tôi là tìm ra thời tiết hay không performSegueWithIdentifier được gọi hay không .. bất kỳ ý tưởng về điều này? – Rob

+0

+1 cho lời giải thích hợp lý về sự khác biệt giữa CNTT một UT, tôi chắc chắn người dùng ít quen thuộc với khái niệm này sẽ thấy nó hữu ích! :) – Rob

+1

OCMock có một phương pháp như xác minh hoặc từ chối chính xác cho loại mục đích này. Với xác minh bạn có thể đảm bảo rằng một phương thức đã được gọi và thông qua từ chối, bạn có thể đảm bảo rằng một phương thức KHÔNG được gọi. Hãy nhớ rằng trong trường hợp của bạn, bạn có thể cần phải sử dụng một phần giả và rằng việc sử dụng nhiều phần giả mocks có thể là dấu hiệu của thiết kế ứng dụng xấu – Alexander

2

Vì vậy, cách duy nhất tôi có thể thấy đối với tôi để kiểm tra đơn vị này đang sử dụng mocks phần:

- (void)testExample 
{ 
    id loginMock = [OCMockObject partialMockForObject:self.controller]; 

    [[loginMock expect] performSegueWithIdentifier:@"memorableWord" sender:[OCMArg any]]; 

    [loginMock performSelectorOnMainThread:@selector(loginButton:) withObject:self.controller.loginButton waitUntilDone:YES]; 

    [loginMock verify]; 
} 

Tất nhiên đây chỉ là một ví dụ về thử nghiệm và không thực sự là thử nghiệm tôi đang thực hiện, nhưng hy vọng chứng minh cách mà tôi phải thử nghiệm phương pháp này trong bộ điều khiển xem của tôi. Như bạn có thể thấy, nếu performSegueWithIdentifier không được gọi, việc xác minh với nguyên nhân thử nghiệm thất bại.

1

Cho đọc OCMock, tôi vừa mua một cuốn sách từ amazon về Bài kiểm tra đơn vị iOS và thực sự tốt để đọc. Tìm kiếm để có được một cuốn sách TDD quá.

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