Objective c 在为OCMock对象调用isKindOfClass时,如何获取模拟值?

Objective c 在为OCMock对象调用isKindOfClass时,如何获取模拟值?,objective-c,unit-testing,mocking,ocmock,Objective C,Unit Testing,Mocking,Ocmock,将OCMock对象传递给函数调用为KindofClass的方法。但是,对于单元测试,如果要将OCMock对象传递给函数调用属于创建部分mock所需类的方法,则返回的值不是mock类,而是OCMockObject。下面的代码可能会对您有所帮助。这对我有用 -(void)testMyTest { FirstViewController* masterVC = [[FirstViewController alloc]init]; SecondViewController *second

将OCMock对象传递给函数调用为KindofClass的方法。但是,对于单元测试,如果要将OCMock对象传递给函数调用属于创建部分mock所需类的方法,则返回的值不是mock类,而是OCMockObject。下面的代码可能会对您有所帮助。这对我有用

-(void)testMyTest
{
    FirstViewController* masterVC = [[FirstViewController alloc]init];
    SecondViewController *second = [[SecondViewController alloc] init];
    id master = [OCMockObject partialMockForObject:second];
    [[master expect] getName:@"PARAM"];
    [masterVC doSomething:master];
    [master verify];

    [masterVC release];
    [second release];
}
FirstViewController中的剂量测量方法

-(void)doSomething:(SecondViewController *)detail
{
    if ([detail isKindOfClass:[SecondViewController class]])
    {
        NSString * returnVal = [detail getName:@"PARAM"];
        NSLog(@"returnVal %@",returnVal);
    }
}
另一种选择是模拟isKindOfClass方法,因此测试用例将变得

- (void)testMyTest
{
     CalculatorViewController* masterVC = [[CalculatorViewController alloc]init];
     id master = [OCMockObject niceMockForClass:[SecondViewController class]];
     BOOL ret = YES;
     [[[master expect] andReturnValue:OCMOCK_VALUE(ret)] isKindOfClass:[SecondViewController class]];
     [[master expect] getName:@"PARAM"];
     [masterVC doSomething:master];
     [master verify];
}

下面是一整篇文章,解释如何准确地编写
OCMock isKindOfClass
方法(默认情况下它不存在)以及如何使用它:

OCMockObject似乎是该框架的基类。您是否正在调用+(id)mockForClass:Class,并想知道为什么创建的对象没有将自己报告为模拟类?如果您仍然存在此问题,您能否介绍您的用例?你想干什么?一些代码有助于分析。它对于根据参数类创建对象的每个工厂类都很有用。在我的例子中,我必须创建真实的对象而不是模拟来测试这些工厂。你能澄清你的问题吗?你是说“返回的值不是mock类的值”,我理解为返回一个类对象或类名,但同时你是说调用isKindOfClass:,它只返回一个布尔值。对于isKindOfClass:mock对象假装是mock类,所以这应该像您期望的那样工作。假设我用niceMockForClass模拟了一个名为“Foo”的类,我们将fooMockedObject称为mock。当我在fooMockedObject上调用方法“class”时,我期望返回“Foo”,但返回“OCMockObject”。当我们测试is fooMockedObject时,该led isKindOfClass for fooMockedObject返回false。使用mock/niceMock的优点是不需要实例化对象。在我的例子中,创建那个对象是很困难的。另一种方法是模拟isKindOfClass方法。类似这样的id master=[OCMockObject niceMockForClass:[SecondViewController类]];BOOL ret=是;//可以更改值[[[master expect]和返回值:OCMOCK_value(ret)]isKindOfClass:[SecondViewController类]];我要做的是使用niceMock和stub方法“class”来返回被模拟的类。对于任何类型的类,只返回YES都更可靠。我不清楚为什么这不是OCMock的默认行为。查看此链接,该链接指出使用isKindOfClass基本上是不正确的,并且使用协议。我使用一个工厂类来创建一个符合协议的对象,从其他也符合其他协议的对象开始。此工厂将根据类的类型创建一个或另一个对象。我不认为这种方法是错误的。