繁体   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