我以類似於Julie Lerman's blog post on EF4 mocks and unit tests的方式爲我的EF存儲庫創建了一個僞造品。EF4 - 假庫中的導航功能?
我的問題是我怎樣才能得到假存儲庫來處理表之間的關係?
說我有兩張客戶和訂單表。他們之間有一對多的關係,這樣一個客戶可以有多個訂單。
我的假庫將成立類似:
public class FakeMyRepository : IMyRepository
{
public FakeMyRepository()
{
Committed = false;
FillCustomers();
FillOrders();
}
public bool Committed { get; set; }
public System.Data.Objects.IObjectSet<Customer> Customers { get; set; }
public System.Data.Objects.IObjectSet<Order> Orders { get; set; }
public void Commit()
{
Committed = true;
}
private void FillCustomers()
{
var data = new List<Customer>()
{
new Customer() { Id = 1, Name = "Jeff" },
new Customer() { Id = 2, Name = "Brian" }
}
this.Customers = new FakeObjectSet<Customer>(data);
}
private void FillOrders()
{
var data = new List<Order>()
{
new Order() { Id = 1, Customer = 1, Value = 100 }
new Order() { Id = 2, Customer = 2, Value = 200 }
new Order() { Id = 3, Customer = 1, Value = 300 }
new Order() { Id = 4, Customer = 2, Value = 400 }
new Order() { Id = 5, Customer = 1, Value = 500 }
}
this.Orders = new FakeObjectSet<Order>(data);
}
}
如果我的測試是這樣它傳遞:
[TestMethod]
public void FindUserByIdTest()
{
var repo = new FakeMyRepository();
var target = new CustomerService(repo);
var actual = target.GetCustomerById(1);
Assert.IsNotNull(actual);
Assert.AreEqual<string>("Jeff",actual.Name);
}
但是如果我想說,訂單數,然後失敗
[TestMethod]
public void FindUserByIdWithOrderCount()
{
var repo = new FakeMyRepository();
var target = new CustomerService(repo);
var actual = target.GetCustomerById(1);
Assert.IsNotNull(actual);
Assert.AreEqual<int>(3,actual.Orders.Count());
}
任何人都可以爲我指出正確的方向嗎?
乾杯。
我沒有測試存儲庫,我正在測試服務方法。在我的例子中,它是一個GetCustomerById()函數,但它可能涉及更多的東西。我只是想看看是否可以構建假回購,否定我不必爲每個單元測試編寫大量模擬代碼。 – Nick
@Nick:是的,假的回購可以這樣構建,但每次都會返回關係**,所以你不會測試正確的代碼。 –