Swift单元测试中的模拟Objective-C代码
注意:这不是我的实际代码,我以一种简单的方式将其重新键入此处,以获得您的帮助Swift单元测试中的模拟Objective-C代码,objective-c,swift,unit-testing,mocking,Objective C,Swift,Unit Testing,Mocking,注意:这不是我的实际代码,我以一种简单的方式将其重新键入此处,以获得您的帮助 我用Objective-C写了这门课 @interface MySpecialManager <NSObject> + (MySpecialManager *)sharedInstance; -(void)someFunctionWithParamOne:(NSString *)paramOne andParamTwo:(NSString *)paramTwo; -(void)someFunctionW
我用Objective-C写了这门课
@interface MySpecialManager <NSObject>
+ (MySpecialManager *)sharedInstance;
-(void)someFunctionWithParamOne:(NSString *)paramOne andParamTwo:(NSString *)paramTwo;
-(void)someFunctionWithParamOne:(NSString *)paramOne andParamTwo:(NSString *)paramTwo success:(void (^)(NSString *))success failure:(void (^)(NSError *error))failure;
@end
如果在我的测试中,虽然我初始化了一个MockMySpecialManager
并调用了第一个方法,但它不会调用第二个方法,因为它只是更新布尔值,对吗?我可以更新mock函数来调用第二个函数,但这感觉像是作弊,而不是真正的单元测试,因为它没有测试我的代码。我如何测试这个
我不知何故(或者我认为是这样)需要将管理器设置为MySpecialManager.sharedInstace()
,调用第一个方法,然后检查是否在mock上调用了第二个方法
有什么帮助吗?我误解了什么/我错在哪里了?您当前的MOC类实际上是目标类的完全替代品,因此您根本没有实际测试它 如果您的MOC是目标类的子类,并且只实现了第二个方法,那么测试可以调用第一个方法,MOC可以验证是否调用了第二个方法 通常,您会使用模拟库来帮助实现这一点,这些库允许您以不同的方式完成上述相同的任务
或者,您不会MOC目标类,而是MOC其所有依赖项。然后,您的测试检查依赖项是否被适当地调用,以及是否具有必要的参数。然后,您的第一个和第二个方法测试设置相同,但期望值略有不同。您的第一个评论让我觉得有点常识!我现在正在进行子类化,看看这会给我带来什么,但我至少现在给了你一个投票。当然,记住,在你的子类中,你也可以调用super,这样你就可以实现第一个和第二个方法来添加测试逻辑,它不会给这个测试增加太多的价值,因为你知道你在调用1,但是它在你将要重用的MOC中很有用
class MockMySpecialManager: NSObject, MySpecialManagerProtocol {
var functionOneWasCalled = false
var functionTwoWasCalled = false
func someFunctionWithParamOne(paramOne: String!, andParamTwo paramTwo: String!) {
functionOneWasCalled = true
}
func someFunctionWithParamOne(paramOne: String!, andParamTwo paramTwo: String!, success: ((String!) -> Void)!, failure: ((NSError!) -> Void)!) {
functionTwoWasCalled = true
}