[英]Prevent void method to being call in a unit test for another method
我正在嘗試對其中另一個方法被調用的方法進行單元測試。 在此內部方法中,訪問db來保留數據,這就是為什么我需要防止實際調用它的原因。 但是以下代碼無法實現這一點。
測試
[Test]
public void Schedule_WhenEntryIsAvailable()
{
#region Arrange
var entryStub= MockRepository.GenerateStub<Entry>();
_entryDal.Stub(_ => _.Retrieve(Arg<long>.Is.Anything)).Return(entryStub);
entryStub.Stub(_ => _.AssignToActionTemplate(Arg<ActionTemplates>.Is.Anything, Arg<long>.Is.Anything, Arg<IUnitOfWork>.Is.Anything));
#endregion
#region act
//I create the deferralRequest
_deferralService.Schedule(deferralRequest);
#endregion
#region assert
//...
#endregion
}
作為Entry類中的Schedule方法
public virtual void Schedule(DeferralRequestDto deferralRequest, bool ignoreSeasonal = false)
{
if (!deferralRequest.Deferrals.Any()) return;
if (Validate(deferralRequest, ValidationGroup.PersonValidation & ValidationGroup.EntryValidation))
{
foreach (var deferral in deferralRequest.Deferrals)
{
var entryFromRequest= EntryFactory.Factory(_entryDal.Retrieve(deferral.Id));
/.... Do different things
var deferToEntry = CreateDeferralEntry(deferral, deferFromEntry, deferralRequest.UserId);
}
}
}
private Entry CreateDeferralEntry(Deferral deferral, Entry @entry, long userId)
{
var deferFromEntry = @entry.GetGentleEntity(); //We're using Gentle as persistent framework
var deferEntry = new entry
{
//We populate the deferEntry using the deferFromEntry fetched and the deferral from the parameters
};
//And after a few thing we call this method that actually persist to the an action table in the db which is the bit I would like to avoid being called
deferToEntry.AssignToActionTemplate(ActionTemplates.Deferral, deferEntry.CreatedBy, null);
return deferToEntry;
}
它位於這個AssignToActionTemplate內部,在這里我將一些數據持久保存到數據庫中,這就是我要防止被調用的原因。 有辦法嗎?
謝謝
編輯:
根據Phil Sandler的評論,
在deferralService的Schedule中,條目是根據deferralRequest從工廠獲取的(我在代碼中添加了幾行)
您正在嘲笑一個具體的類,在.Net中通常很難。 請參閱“ 建議模擬具體課程嗎?”。
如果您可以為Entry創建一個接口,並使要測試的類依賴於該接口,那么它將使測試(通過模擬)變得更加容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.