我正在用單元測試(TDD)弄溼我的腳。我有一個基本的存儲庫模式,我正在測試,我不確定我是否正確地做事情。在這個階段,我正在測試我的域名,而不是擔心控制器和視圖。爲了保持簡單,這裏是一個演示項目。使用存儲庫模式時測試域
類
public class Person
{
public int PersonID { get; set; }
public string Name{ get; set; }
}
接口
public interface IPersonRepository
{
int Add(Person person);
}
混凝土
public class PersonnRepository : IPersonRepository
{
DBContext ctx = new DBContext();
public int Add(Person person)
{
// New entity
ctx.People.Add(person);
ctx.SaveChanges();
return person.id;
}
}
我添加NUnit的和最小起訂量,以我的測試項目,並想知道如何正確地測試功能。
我不確定是否正確,但在閱讀完一些博客後,我創建了一個FakeRepository,但是如果我基於此測試,那麼如何驗證我的實際接口?
public class FakePersonRepository
{
Dictionary<int, Person> People = new Dictionary<int, Person>();
public int Add(Person person)
{
int id = People.Count + 1;
People.Add(id, person);
return id;
}
}
然後用
[Test]
public void Creating_A_Person_Should_Return_The_ID()
{
FakePersonRepository repository = new FakePersonRepository();
int id = repository.Add(new Person { Name = "Some Name" });
Assert.IsNotNull(id);
}
測試我是不是在任何地方接近測試在正確的莊園?
我想測試一些事情,比如未傳遞名稱導致錯誤等。
也謝謝。我可能會錯過理解或者我的例子令人困惑。在這種情況下,dbContext是爲了表示EF DbContext,它允許我使用EF和數據庫。因此它不會顯示屬性。 我的具體PersonRepository將訪問EF寫入數據庫,我明白顯示不是單元測試,但後來集成測試。 – stevejgordon 2012-04-18 09:22:53
我假設我需要一個內存版本的這個實現了相同的接口(從等式中拿出數據庫),然後我想確保我的測試意味着我們的測試,我們確認我的方法。我想我有點失落,因爲我對MVC,EF Code第一和TDD的概念都很陌生。 – stevejgordon 2012-04-18 09:25:15
你想測試你的具體實現,而不是你的接口。爲了做到這一點,你需要將你的實現從DBContext中分離出來,這就是爲什麼我建議你爲它提取一個接口,你可以將它注入到你的PersonRepository具體類中。 單元測試的關鍵是確保您的所有依賴項都是可注入的,以便您可以隔離類中的代碼。在你的單元測試中,你傳遞你的依賴關係的模擬版本。在你的情況下,這意味着你必須能夠注入你的DBContext,如上所述。 – 2012-04-18 14:56:02