我很難理解這裏是否有正確的方法。我想測試一個存儲庫。存儲庫依賴於DbContext。我希望能夠驗證存儲庫沒有調用一個函數添加一個屬於DbContext成員的IDbSet屬性。如何將SingleOrDefault與Rhino嘲諷存檔
我試過兩種方法。驗證行爲,並用狀態進行驗證。似乎驗證行爲是正確的,因爲誰知道虛假對象中存在狀態。
public void VerifyBehaviour()
{
// Arrange
var stubEntities = MockRepository.GenerateStub<IWsStatContext>();
var stubManufcturers = MockRepository.GenerateStub<IDbSet<Manufacturer>>();
var manufacturer = new Manufacturer() { Name = "Dummy" };
var manufacturers = new List<Manufacturer>();
manufacturers.Add(manufacturer);
stubManufcturers.Stub(x => x.Local).Return(new System.Collections.ObjectModel.ObservableCollection<Manufacturer>(manufacturers));
stubManufcturers.Stub(x => x.SingleOrDefault(m => m.Name == "Dummy")).Return(manufacturer);
stubEntities.Manufacturers = stubManufcturers;
// Act
var sut = new EquiptmentRepository(stubEntities);
sut.AddManufacturer(manufacturer);
// Assert
stubManufcturers.AssertWasNotCalled(x => x.Add(manufacturer));
}
public void VerifyState()
{
// Arrange
var stubEntities = MockRepository.GenerateStub<IWsStatContext>();
var stubManufacturers = new InMemoryDbSet<Manufacturer>();
var manufacturer = new Manufacturer() { Name = "Dummy" };
stubManufacturers.Add(manufacturer);
stubEntities.Manufacturers = stubManufacturers;
// Act
var sut = new EquiptmentRepository(stubEntities);
sut.AddManufacturer(manufacturer);
// Assert
Assert.AreEqual(stubManufacturers.Count(), 1);
}
驗證行爲方法失敗,在SingleOrDefault的存根周圍出現NullReferenceExceptions。所以我找到最好的帖子來驗證狀態並使用假DbSet。但是檢查假物體的狀態感覺不對。如果Add函數的實現方式與真實的不同(它最初是和我的測試即使我的存儲庫被破壞傳遞的)也會如何。
有誰知道如何存根SingleOrDefault,所以我可以檢查添加被稱爲?我無法檢查添加在非rhinomocked存根上調用。
由於
謝謝你。所以一般來說,如果你不能使用存根嘲諷框架,然後退回到狀態驗證? – user1385713
@ user1385713:基本上,是的。有一種叫做* extract和override *的技術,你可以將你的類的有問題的部分提取到'virtual'方法,並且使你的* sut派生類覆蓋這些虛擬方法(例如提供假值/存根)。這很難看,但可以在某些情況下工作。使用可靠的對象來驗證狀態(就像你在你的'VerifyState'中做的那樣)是沒問題的。 –