2013-02-07 60 views
0

我有一個資料庫,如下面:犀牛嘲笑調用時獲取參數的

internal class Repository<T> : IRepository<T> where T : class 
{ 
    public virtual ITable GetTable() 
    { 
     return _context.GetTable<T>(); 
    } 

    public virtual void InsertOnSubmit(T entity) 
    { 
     GetTable().InsertOnSubmit(entity); 
    } 

    public virtual void SubmitChanges() 
    { 
     _context.SubmitChanges(); 
    } 
} 

現在制度下的測試類是像下面這樣:

public class CustomerHelper 
{ 
    private readonly IRepository<Customer> _customerRepository; 
    CustomerHelper(IRepository<Customer> customerRepository) 
    { 
     _customerRepository = customerRepository; 
    } 

    public void CreateCustomer(int createdBy, int customerId) 
    { 
     var customerToUpdate = _customerRepository.Get.Single(c => c.Id == customerId) 

     customerToUpdate.CreatedBy =createdBy; 
     customerToUpdate.CreateDate = DateTime.Now; 

     _customerRepository.InsertOnSubmit(customerToUpdate); 
     _customerRepository.SubmitChanges(); 
    } 
} 

我的測試方法的CreateCustomer方法如下,使用RhinoMocks。

[TestMethod] 
public void CreateCustomer() 
{ 
    // Arrange 
    Customer customer = new Customer 
    { 
     Id = 1 
    }; 
    IRepository<Customer> repository = MockRepository.GenerateMock<IRepository<Customer>>(); 
    var customerList = new List<Customer> { customer }.AsQueryable(); 

    repository.Stub(n => n.Get).Return(nonLaborclassificationList); 

    CustomerHelper helper = new Customer(repository); 
    helper.CreateCustomer(1, customer.Id); 

    // Now here I would liek to test whether CreatedBy, CreateDate fields on cutomer are updated correctly. I've tried the below 

    Customer customerToUpdate; 

    repository.Stub(c => c.InsertOnSubmit(customer)).WhenCalled(c => { customerToUpdate = n.Arguments[0]; }); 
    Assert.AreEqual(1, customerToUpdate.CreatedBy); 
} 

上述代碼無法正常工作。我正在刷的地方InsertOnSubmit()方法,試圖從CreateCustomer()方法得到customerToUpdate實例。我如何編寫斷言來確保CreatedBy,CreateDate設置正確?

+1

''當你存根'Get'(是一個屬性還是什麼?我在上面顯示的Repository 類中沒有看到它)時會返回'nonLaborclassificationList',但它在此代碼中的任何位置都沒有定義。 –

回答

0

一般的策略是這樣的:

  1. 存根庫來返回你想要更新
  2. 採取必要行動的特定客戶,即helper.CreateCustomer()
  3. 看看您最初存根對象有權設置的值

在這種情況下,您可能只需檢查您創建的第一個被存入存儲庫的Customer對象。您正在測試的實際代碼使用的是相同的對象(相同的參考),所以在InsertOnSubmit()獲得對象時,您確實不需要最後一段代碼。但是,如果你仍然想這樣做,你可以使用AssertWasCalled的幫助:

repository.AssertWasCalled(
    x => x.InsertOnSubmit(Arg<Customer>.Matches(c => c.CreateBy)) 

要進行調試,也是一個GetArgumentsForCallsMadeOn方法是有用的,如果你可以使用調試器逐步完成。

0

有您的代碼2個問題:

  1. 傑夫布里奇曼說,在評論,nonLaborclassificationList沒有定義。我假設應該返回customerList

  2. InsertOnSubmit()對於repository在執行測試動作helper.CreateCustomer(1, customer.Id)後被勾住。所以這個存根不起作用。
    存根應設置在測試動作之前,因爲排列

,當然,如果你想斷言CreatedDate設置是否正確,您必須編寫特定Assert爲:)。