在S#arp架构中测试状态 - 最佳实践

时间:2010-11-24 15:22:09

标签: tdd rhino-mocks s#arp-architecture sharp-architecture

如何在S#arp架构项目中测试状态?

例如,我有一个自定义RoleProvider。我想测试方法provider.AddUsersToRoles(string [],string [])。

所以我从:

开始
// Arrange
const string ficticiousRole = "Management";
var userToExpect = UserInstanceFactory.CreateValidTransientUser();
var roleToExpect = RoleInstanceFactory.CreateValidTransientRole();

userRepository.Expect(r => r.GetByUsername(userToExpect.Username))
              .Return(userToExpect);
roleRepository.Expect(r => r.GetByName(ficticiousRole))
              .Return(roleToExpect);

var userNames = new List<string>();
var roleNames = new List<string>();
userNames.Add(userToExpect.Username);
roleNames.Add(ficticiousRole);

然后我将用户添加到角色。然后我检查用户是否担任此角色。

// Act
roleProvider.AddUsersToRoles(userNames.ToArray(), roleNames.ToArray());
var isNewUserInRole = roleProvider.IsUserInRole(userToExpect.Username, ficticiousRole);

// Assert
Assert.IsTrue(isNewUserInRole);

问题是我正在使用Rhino Mocks。我对Rhino Mocks知之甚少,但根据我的理解(根据Ayende Rahien的说法)你使用Rhino Mocks来测试操作,而不是状态。

所以我猜一个内存中的SqlLite数据库会更合适吗?在S#arp Arch中执行此操作的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

你不能用Rhino Mocks做到这一点,因为这只是一个虚假的框架,它会伪造数据库调用等等。听起来你真的想要测试数据库的持久性,这基本上是数据库集成测试。在这种情况下,您肯定希望使用内存数据库,如SqlLite(如果可能!),而不是命中SQL Server实例。

您要做的是在每个测试开始时或测试类拆除数据库(如果已存在),重建数据库,使用一些种子数据填充数据库,然后测试数据库交互。这样,您可以确保在每次测试运行之前都具有已知的数据库状态。

我在项目中做的一件事是将我的所有只读测试分组到一个测试类中,这样我只需要为类执行一次数据库重建步骤,并将所有删除,更新和插入测试移到其他测试在每次测试之前重建数据库的类。如果有足够的测试,这可能非常耗时,并且可能希望降级到CI服务器。

答案 1 :(得分:0)

如果没有看到其余的代码,就很难回答这个问题。