簡體   English   中英

防止在另一個方法的單元測試中調用void方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM