我建议使用像这样的模拟库Moq https://code.google.com/p/moq/ or 犀牛模型 http://hibernatingrhinos.com/oss/rhino-mocks。可以找到一个使用 Moq 的很好的教程here http://www.codeproject.com/Articles/47603/Mock-a-database-repository-using-Moq.
在决定使用哪一种之前,以下信息可能会有所帮助:
http://graemef.com/blog/2011/02/10/A-quick-comparison-of-some-.NET-mocking-frameworks/ http://graemef.com/blog/2011/02/10/A-quick-comparison-of-some-.NET-mocking-frameworks/
http://jimmykeen.net/articles/09-jul-2012/mocking-frameworks-comparison-part-1-introduction http://jimmykeen.net/articles/09-jul-2012/mocking-frameworks-comparison-part-1-introduction
附加信息:单元测试框架对比可以找到.
UPDATE 按照OP的要求
创建内存数据库
var bookInMemoryDatabase = new List<Book>
{
new Book() {Id = 1, Name = "Book1"},
new Book() {Id = 2, Name = "Book2"},
new Book() {Id = 3, Name = "Book3"}
};
模拟您的存储库(我在以下示例中使用了 Moq)
var repository = new Mock<IRepository<Book>>();
设置您的存储库
// When I call GetById method defined in my IRepository contract, the moq will try to find
// matching element in my memory database and return it.
repository.Setup(x => x.GetById(It.IsAny<int>()))
.Returns((int i) => bookInMemoryDatabase.Single(bo => bo.Id == i));
通过在构造函数参数中传递模拟对象来创建库对象
var library = new Library(repository.Object);
最后进行一些测试:
// First scenario look up for some book that really exists
var bookThatExists = library.GetByID(3);
Assert.IsNotNull(bookThatExists);
Assert.AreEqual(bookThatExists.Id, 3);
Assert.AreEqual(bookThatExists.Name, "Book3");
// Second scenario look for some book that does not exist
//(I don't have any book in my memory database with Id = 5
Assert.That(() => library.GetByID(5),
Throws.Exception
.TypeOf<InvalidOperationException>());
// Add more test case depending on your business context
.....