gpt4 book ai didi

unit-testing - 对于 Kiwi 模拟缺少验证方法是否有解决方法?

转载 作者:行者123 更新时间:2023-12-03 07:46:32 27 4
gpt4 key购买 nike

我非常偏爱高度可预测的 Arrange Act Assert format用于单元测试。

因为 Kiwi 没有针对模拟的显式验证语句,所以它强制采用不同的模式,例如:

// Arrange
Thing *mockThing = [CollaboratingClass mock];
TestedClass *sut = [[TestedClass alloc] initWithCollaborator:mockThing];

// Expect (collaboration expectations)
[[[mockThing should] receive] someMessage];

// Act
[mockArray someMethodInvolvingCollaborator];

// Assert (state expectations)
[[sut.someProperty should] equal:someValue];

我知道验证无论如何都会发生,但更喜欢能够快速扫描测试,将断言和期望放在一个可预测的地方。 mockito 很好地启用了此功能。 (及其 Objective-C 实现 OCMockito ),其中验证步骤事后指定方法调用,从而不需要事先的期望步骤。

我是新西兰的新手,所以我可能错过了文档中的一些内容。有没有办法显式验证 Kiwi 模拟?

最佳答案

您提供的有关“Arrange Act Assert”的链接对此模式的优点进行了说明(已添加强调):

Benefits:

  • ...
  • Makes some TestSmells more obvious:
    • Assertions intermixed with "Act" code.
    • Test methods that try to test too many different things at once

特别是如果您的目标是能够快速扫描断言,我认为您的示例最好分为两个测试用例:协作测试和对象状态如何变化的单独测试。

我实际上认为这里有第四步,特定于协作测试,即期望。 Kiwi 允许您安排、期望、执行,其中 OCMock 实际上要求您通过要求 [mockThing] 添加第四个冗余的断言 步骤验证]

我认为这将是设置这些测试的更好方法:

__block TestedClass *sut;
beforeAll(^{
sut = [[TestedClass alloc] initWithCollaborator:mockThing];
}

// Collaboration: Arrange, Expect, Act
it(@"sends someMessage to mockThing", ^{
// Arrange
Thing *mockThing = [CollaboratingClass mock];

// Expect
[[[mockThing should] receive] someMessage];

// Act
[mockArray someMethodInvolvingCollaborator];
}

// State: Arrange, Act, Assert
it(@"sets someProperty to the return value of someMethod", ^{
// Arrange
NSString *expectedString = @"foo";
Thing *mockThing = [CollaboratingClass mock];
[[mockThing stubAndReturn:expectedString] someMessage];

// Act
[mockArray someMethodInvolvingCollaborator];

// Assert
[[sut.someProperty should] equal:expectedString];
}

通过此设置获得的好处是,如果您需要基于协作者的返回值进行分支,您只需添加另一个测试,该测试会 stub someMethod 以返回不同的结果,并且做出不同的断言:

it(@"sets someProperty to nil if someMethod returns baz", ^{
// Arrange
Thing *mockThing = [CollaboratingClass mock];
[[mockThing stubAndReturn:@"baz"] someMessage];

// Act
[mockArray someMethodInvolvingCollaborator];

// Assert
[sut.someProperty shouldBeNil];
}

最终,我认为 Kiwi 不要求我们验证我们的测试替身,从而帮了我们一个忙。

关于unit-testing - 对于 Kiwi 模拟缺少验证方法是否有解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15761207/

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