使用OCMock将方法“类”存储起来

时间:2013-12-12 04:05:09

标签: ios iphone objective-c ocmock

我是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");

1 个答案:

答案 0 :(得分: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时是否已调用。就这样。而你必须创建部分模拟。