如果您正在使用實體框架,則無法進行單元測試數據訪問層。
Erik Alsmyr提供的解決方案非常錯誤! 看看這裏爲什麼 - What's the point of in memory IDbSet?。
當您在內存數據庫集中使用時,您正在將Linq運行到對象。當您使用EF的DbContext時,您的Linq將轉換爲SQL。這是兩件不同的事情!
這是很容易編寫的代碼,將在內存數據庫集(你所有的單元測試將通過,你會很高興),只是第一次嘗試擊中數據庫時發現運行時錯誤。
讓我們稍微修改一下這段代碼。如果我們使用FIRSTNAME,LASTNAME,我不認爲FULLNAME應該有setter。它應該從FIRSTNAME和LASTNAME計算。
class User
{
public string FIRSTNAME { get; set; }
public string LASTNAME { get; set; }
public string FULLNAME
{
get { return string.Format("{0}, {1}", LASTNAME, FIRSTNAME }
}
User(string firstName, string lastName)
{
this.FIRSTNAME = firstName;
this.LASTNAME = lastName;
}
}
現在你可以編寫測試這樣的,它會通過(當然,你在控制器實現它之後)
public IMyEntities GetRepoWithUsers(params User[] users)
{
var inMemoryUsers = new InMemoryDbSet<User>();
var mockData = new Mock<IMyEntities>();
mockData.Setup(m => m.Users).Returns(inMemoryUsers);
return mockData.Object;
}
[Test]
public void GetUserByFullname()
{
var ankaArne = new User("Arne", "Anka");
var bjornBertil = new User("Bertil", "Björn");
var repo = GetRepoWithUsers(ankaArne, bjornBertil);
var usersController = new UsersController(repo);
var found = usersController.GetUser("Anka, Arne");
Assert.NotNull(found);
Assert.AreEqual("Anka", found.LASTNAME);
Assert.AreEqual("Arne", found.FIRSTNAME);
}
但是,當你運行它,對「真實」的DbContext和「真實」 DbSet它會拋出,因爲你不能對計算屬性執行Linq查詢。僅限於那些映射到數據庫列的映射。那麼測試的重點是什麼?
這是你的工作...請讓它作爲答案,如果它可以幫助你。 – 2013-03-01 05:04:44