ios: 模拟私有属性

ios: Mocking private properties

我想在我的 class 中模拟一个私有数组 属性。通过这样做,我已经在我的单元测试中提供了它。 (这是在我的单元测试文件中)

@interface MyViewController ()

@property (nonatomic, strong) NSArray myArray;

@end

假设我有一个名为 Person 的类型,这个数组应该包含人物对象。所以我在我的测试用例中做了以下事情

- (void)testBeneficiariesCount {
    // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
    id mockArray = OCMClassMock([NSArray class]);

    self.myVC.myarray = mockArray;


    Person *p1 = [[Person alloc] init];
    Person *p2 = [[Person alloc] init];
    Person *p3 = [[Person alloc] init];
    Person *p4 = [[Person alloc] init];
    Person *p5 = [[Person alloc] init];

    p1.name = @“Alice"; p2.name = @“James”; p3.name = @“Oscar"; p4.name = @“Harri”; p5.name = @“John”;
    persons = [NSArray arrayWithObjects:p1,p2,p3,p4,p5,nil];


    OCMStub([self.myVC myArray]).andReturn(persons);

    XCTAssertEqual([self.myVC numberOfPersons], 5);

 }

myVC 有一个名为 numberOfPersons 的方法,当我 运行 这个时,测试用例失败并抱怨 (0) is not equal to (5)。这意味着我无法成功地模拟我的数组,因为我还尝试打印模拟数组但它什么也没有。

有人能告诉我我做错了什么吗?

您需要一个 mock 来存根,从它的外观来看,self.myVC 不是 mock。

我建议为视图控制器和之后的存根创建一个 partial mock

MyViewController *partialMock = OCMPartialMock(self.myVC)

OCMStub([partialMock myArray]).andReturn(persons);

XCTAssertEqual([partialMock numberOfPersons], 5);

顺便说一句,如果您无论如何都在存根 myArray getter.

,则不需要 mockArray 用法