我想知道我应该测试什么,以及我应该如何测试IRepository。
目前,我在我的域中创建了一个MemoryRepository,并且我正在用假数据进行测试。不过,我不确定这是否正确。首先创建一些数据,然后测试存储库是否正确地返回数据,这感觉有点奇怪。
这是我的MemoryRepository的样子:
public class MemoryRepositoryUser : IRepositoryUser
{
List<User> fakeUsers;
public MemoryRepositoryUser(List<User> fakeUsers)
{
this.fakeUsers = fakeUsers;
}
public IEnumerable<User> GetAll()
{
return fakeUsers;
}
public User GetById(string id)
{
return GetAll().Where(u => u.Username == id).Single();
}
}下面是我写的一些测试:
[TestFixture]
class TestMemoryRepositoryUser
{
private MemoryRepositoryUser repository;
public TestMemoryRepositoryUser(){
repository = new MemoryRepositoryUser(FakeData.GetFakeUsers());
}
[Test]
public void Get_All_Users()
{
var Users = repository.GetAll();
Assert.IsNotNull(Users);
Assert.IsInstanceOf(typeof(IEnumerable<User>), Users);
Assert.AreEqual(3, Users.Count());
}
[Test]
public void Get_User_By_ID()
{
var Username = "Bob";
var User = repository.GetById(Username);
Assert.IsNotNull(User);
Assert.AreEqual(Username, User.Username);
}
}我是测试代码的新手,我对应该测试的代码有很多问题。我猜测试MemoryRepository可以帮助我在界面中创建所需的所有功能,而不必与数据库对话?
发布于 2010-01-20 04:29:59
通常,存储库测试是集成测试,它们确实与数据库通信。正如您已经注意到的,使用假数据测试存储库没有什么意义。
它通常是被模拟来测试其他类的存储库。通过模拟除被测类之外的所有依赖项,您可以隔离正在测试的函数。声明存储库接口的好处是,它允许它们很容易地被模拟,并在其他代码的单元测试中使用。
发布于 2010-01-20 04:44:31
我注意到的一件事可能与您的问题无关,那就是repository的状态应该独立于所有其他运行的测试。在这种情况下,每个测试都会对相同的实例执行操作。
考虑一下在编写Delete_user测试时会发生什么。即使该测试在Get_All_Users之前运行,也没什么关系。我会在每次测试中创建一个新的MemoryRepositoryUser。这种测试气味可以存在于其他测试中,并不特定于您是否应该测试假货。
通常我会使用sub/mock而不是fake。正如Jamie所提到的,该接口允许您轻松地模拟您的依赖项。
https://stackoverflow.com/questions/2096622
复制相似问题