2013-12-12 41 views
1

我是OCMock的新手,所以我可能忽略了一些簡單的東西,但是我的問題是我似乎無法在我創建的模擬中存根方法class。下面是我如何設置我的測試的一部分:用OCMock剔除「class」方法

// Unit Test 
id mock = [OCMockObject mockForClass:[MySubClass class]]; 
[[[mock stub] andReturn:[MySubClass class]] class]; 
... 
[someObject someMethodWithParam:mock]; 
... 

這裏是我的執行someMethodWithParam:

// Implementation 
- (void)someMethodWithParam:(MySuperClass *)param { 
    [[param class] someClassMethod]; 
} 

的問題是,[param class]回報OCClassMockObject代替MySubClass。當調用someClassMethod時,這會導致「無法識別的選擇器發送到類」錯誤。我試過使用部分模擬,但似乎沒有幫助。

編輯:

這裏有一個簡單的測試,將不會通過:

// Unit Test 
id mock = [OCMockObject mockForClass:[MySubClass class]]; 
[[[mock stub] andReturn:[MySubClass class]] class]; 
XCTAssertEqual([mock class], [MySubClass class], @"The mock's class should be MySubClass"); 

回答

0

看看你-someMethodWithParam:。它不會返回任何東西。這是無效的。所以這是對這種方法的錯誤測試。你做了模擬,即使方法不能返回任何東西,也必須返回一些東西。 這個測試應該看起來像如下:

MyClass object = [MyClass new]; /// instance of class which has someMethodWithParam: method 
id mock = [OCMockObject partialMockForObject:object]; 
[[mock expect] someClassMethod]; 

[mock someMethodWithParam:[OCMArg any]]; 
[mock verify]; 

在這種方法只一下就可以是測試期望。您可以測試您的方法中的方法是否已被調用。因此,您可以測試是否調用-someMethodWithParam方法-someClassMethod已被調用。就這樣。你必須創建部分模擬。

+1

OCMockObject + mockForClass:也可以在這裏工作,以便在測試不需要它的情況下爲您節省創建對象實例的空間。 – ImHuntingWabbits