有没有办法在 objective c 中测试实例变量?
Is there a way to test an instance variable in objective c?
我需要在 Objective C.
中测试一个实例变量
我在 myViewController.m
中有这个片段
@implementation myViewController
{
NSView *myView;
}
我需要在 myViewControllerTest.mm
中添加一个测试来测试 myView.window
恰好是 nil
的情况
-(void) myTest
{
// 1. assert condition 1 is true
// 2. mock myView.window and set it to nil OR set myView.window directly to nil
// 3. assert condition 1 is false
}
我想知道在测试中实现第 2 步的最佳方法。我尝试过的方法:
- 添加一个明确的 setter
- (void)setMyView:(NSView*)myView
只是为了单元测试目的,并在 myTest 中使用它。
我感觉这不是个好办法。
- 将
myView
设为 属性 并将其放入 myViewController.h
中,这样我就可以得到一个 setter 而无需明确定义
- 尝试使用 OCMock 模拟失败。 (需要进一步探索)
请建议最好的方法是什么,其中 pros/cons 是什么。
谢谢!
编辑:我最终在测试文件中使用的答案。
[myViewController setValue:nil forKeyPath:@"myViewControl.window"];
您可以在测试文件中添加 setter 仅用于测试 myViewControllerTest.mm
这对您的生产代码没有影响。
像下面一样使用扩展程序
// Write this in test file.
@interface MyViewController(Test)
- (void)setMyView:(NSView *)myView;
@end
或仅使用 valueForKey:
获取私有字段。
-(void) myTest
{
id myViewController = ...;
NSView *myView = [myViewController valueForKey:@"myView"];
myView.window = nil;
// ...
}
我需要在 Objective C.
中测试一个实例变量我在 myViewController.m
@implementation myViewController
{
NSView *myView;
}
我需要在 myViewControllerTest.mm
中添加一个测试来测试 myView.window
恰好是 nil
-(void) myTest
{
// 1. assert condition 1 is true
// 2. mock myView.window and set it to nil OR set myView.window directly to nil
// 3. assert condition 1 is false
}
我想知道在测试中实现第 2 步的最佳方法。我尝试过的方法:
- 添加一个明确的 setter
- (void)setMyView:(NSView*)myView
只是为了单元测试目的,并在 myTest 中使用它。 我感觉这不是个好办法。 - 将
myView
设为 属性 并将其放入myViewController.h
中,这样我就可以得到一个 setter 而无需明确定义 - 尝试使用 OCMock 模拟失败。 (需要进一步探索)
请建议最好的方法是什么,其中 pros/cons 是什么。 谢谢!
编辑:我最终在测试文件中使用的答案。
[myViewController setValue:nil forKeyPath:@"myViewControl.window"];
您可以在测试文件中添加 setter 仅用于测试 myViewControllerTest.mm
这对您的生产代码没有影响。
像下面一样使用扩展程序
// Write this in test file.
@interface MyViewController(Test)
- (void)setMyView:(NSView *)myView;
@end
或仅使用 valueForKey:
获取私有字段。
-(void) myTest
{
id myViewController = ...;
NSView *myView = [myViewController valueForKey:@"myView"];
myView.window = nil;
// ...
}