gpt4 book ai didi

ios - 使用 OCMockito 验证方法调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:30:38 25 4
gpt4 key购买 nike

我在 ClassA 中有这两个方法

-(IBAction)onSubmit;
-(void)validateName:(NSString*)name;

@实现

- (IBAction)onSubmit {
[self validateName:self.textfield.text];
}

-(void)validateName:(NSString*)name{
// do something
}

我的测试如下所示:

//given
ClassA *classA = mock([ClassA class]);
classA.textfield.text = @"Foo";

// when
[classA onSubmit];

[verify(classA) validateName:@"Foo"];

但这不起作用,我不断得到:

Expected 1 matching invocation, but received 0

当调用 onSubmit 时,如何编写一个测试来验证是否执行了 validateName。

最佳答案

适当的单元测试测试内部状态和外部行为。您的单元测试正在测试您的代码是否做某事,而不是如何做某事。状态验证告诉您已达到预期结果,而行为验证告诉您协作对象正确地与被测系统交互。这使您可以做一些很棒的事情,例如重构。

内部状态的测试是这样的:

Given an initial state, if the system under test does something, then the resultant state should be this.

外部行为测试是这样的:

If the system under test does something, then another unit should do something else.

第一类测试是通过标准断言完成的(assertThat() 在 OCHamcrest 的情况下调用)。第二种测试是(正确地)通过测试替身的验证完成的(在 OCMockito 的情况下调用 verify())。

模拟被测系统没有任何意义。如果您发现有必要测试内部行为(即被测系统调用的特定方法),那么您需要将这些行为映射到状态。在您的情况下,这意味着 ClassA 实现了一个标志,例如 BOOL nameValidated(最好使用 getter isNameValidated)或一个变量,例如 NSString *validatedName.

关于ios - 使用 OCMockito 验证方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15690600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com