如何在多个 OCUnit 测试用例之间共享代码?

Posted

技术标签:

【中文标题】如何在多个 OCUnit 测试用例之间共享代码?【英文标题】:How to share code among several OCUnit test cases? 【发布时间】:2012-06-12 09:20:45 【问题描述】:

有没有办法在多个 OCUnit 测试用例之间共享代码?也许我遗漏了一些明显的东西,但我做不到......

我试图将通用代码放在另一个类中,但似乎您只能在从 SenTestCase 继承的类的实例方法中使用 STAssertxxx 宏。考虑到这一点,我将这个通用代码放在从 SentTestCase 继承的单例中,没有测试方法,但这似乎打破了 OCUnit 的一些内部假设,因为我没有从共享代码中的失败测试中得到任何错误。

我当前的代码(不工作)是这样的:

@interface TestHelper : SenTestCase
+ (TestHelper *)sharedHelper;
- (void)assertSomething:(id)object;
@end

@implementation TestHelper
+ (TestHelper *)sharedHelper

    // Typical singleton magic


- (void)assertSomething:(id)object

    STAssertWhateverOnObject(object, ...);

@end



@interface RealTestCase : SenTestCase
- (void)testWhatever;
- (void)testAnotherThing;
@end

@implementation RealTestCase
- (void)testWhatever

    [[TestHelper sharedHelper] assertSomething:someObject];
    STAssertOtherThings(someObject, ...);


- (void)testAnotherThing

    [[TestHelper sharedHelper] assertSomething:someSimilarObject];
    STAssertSomeOtherThings(someSimilarObject, ...);

@end

请注意,这是一个简单的示例。在这种情况下,我可以将所有代码放在 RealTestCase 类中,但我想要一个通用的解决方案来在多个测试用例之间共享代码,而不仅仅是在同一测试用例中的方法之间。

顺便说一句,我在使用 Kiwi 时也遇到了类似的问题。

【问题讨论】:

【参考方案1】:

我的首选方式是使用函数/方法生成数据进行测试(例如返回BOOL 条件),而不是进行实际测试。

在某些情况下,我确实使用了宏函数 - 它直接展开到您的测试用例中并且没有任何限制。

【讨论】:

【参考方案2】:

我认为你的选择是:

使用独立的辅助函数,而不是辅助类。或者, 使用不同的断言机制,例如 OCHamcrest,它不会限制您使用 SenTestCase 子类。

可以编写类似于 ST 的自定义断言宏,但这很痛苦(也是我编写 OCHamcrest 的部分原因)。

【讨论】:

以上是关于如何在多个 OCUnit 测试用例之间共享代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写 OCUnit 测试用例

为啥我的班级用错误代码 138 使我的 OCUnit 测试用例崩溃?

OCUnit - 测试用例失败时中断?

TestNG,Selenium 如何在多个类之间共享对象

OCUnit的测试用例类中是不是需要在公共接口中定义测试方法

OCUnit 测试用例未运行