2013-03-01 108 views
1

我在写一组单元测试来测试CRUD系统。使用TestContext在单元测试之间共享信息

我需要Test1注册用户 - 它返回一个ServiceKey 然后我需要在Test2添加数据,我需要ServiceKey

什么是传递ServiceKey的最佳方式的有哪些?我试图在TestContext中设置它,但它似乎在测试之间消失。

回答

2

你不应该在单元测试之间共享一个状态,单元测试是单元测试的一个非常重要的属性 - Independency。测试不应该互相影响。

看到这个StackOverflow的帖子:What Makes a Good Unit Test?

编辑:回答评论

要共享的逻辑/行为(方法),你可以提取公共代码到一个辅助方法,并从不同的测试调用它,为此创建一个用户模拟实例辅助方法:

private IUser CreateUser(string userName) 
{ 
    var userMock = MockRepository.GenerateMock<IUser>(); 
    userMock.Expect(x => x.UserName).Return(userName); 
    return userMock; 
} 
+0

但我必须复制代码来测试创建用户。 - 我讨厌复制+粘贴代码 – GreyCloud 2013-03-01 15:37:04

+0

查看更新的答案 – sll 2013-03-03 12:27:37

0

单元测试的思想是每个测试检查一个功能。如果您在测试之间创建了依赖关系,则不再肯定它们会一直通过(它们可能会以不同的顺序执行,等等)。

你可以在你的具体情况下做的是保持你的Test1原样。它只关注注册过程的功能。你不必在任何地方保存那ServiceKey。只是在测试方法内部断言。

对于第二次测试,您必须设置(伪装)您需要的所有设备才能成功运行。遵循"Arrange Act Assert"-Principle是一个好主意,您可以在其中设置数据以进行测试,对其执行操作,然后检查一切是否按预期工作(它还为您的测试增加了更多的清晰度和结构)。

因此,最好假冒ServiceKey您将在第一次测试中获得。这样,控制要测试的数据也更容易。使用模拟框架(例如vs2012中的moq或fakes)以您需要的方式安排您的数据。 moq是一个非常轻量级的嘲笑框架。如果你还没有使用任何嘲笑的工具,你应该检查它。

希望这有助于。