2013-12-12 40 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