Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift单元测试中的模拟Objective-C代码_Objective C_Swift_Unit Testing_Mocking - Fatal编程技术网

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
}