簡體   English   中英

從模擬方法調用中調用的私有方法中的部分模擬測試失敗

[英]Partial Mock Test fails on call in Private Method that was called from Mocked method call

下面,我有一個要測試的對象的代碼。 我在測試中使用了部分模擬,並且在測試GenerateReport方法時想模擬對InsertData的調用。 由於某種原因,我的測試將繼續通過InsertData到DoSomeStuff進行下去,並在Path.Combine行上失敗。 我想念什么?

public class MyClass : IMyClass
{
    private readonly IMyClassDataProvider _myClassDataProvider;

    public virtual string WorkingDirectory { get; set; }

    public MyClass(IMyClassDataProvider myClassDataProvider)
    {
        _myClassDataProvider = myClassDataProvider;
    }

    internal virtual void ValidateWorkingDirectory()
    {
        if (string.IsNullOrEmpty(WorkingDirectory))
        {
            throw new ApplicationException("Must set Working Directory before any method calls.");
        }
    }

    public virtual void GenerateReport(vars)
    {
        ValidateWorkingDirectory();
        InsertData(_myClassDataProvider.GetData(vars), "ReportName"); 
                    //want to mock the call above
    }

    internal virtual void InsertData(DataSet analysis, string fileName)
    {
        DoSomeStuff();
    }

    private static void DoSomeStuff()
    {
        string fileName = FileNameProvider.Get();
        Path.Combine(WorkingDirectory, fileName); //fails here!
    }
}


[TestFixture]
public class MyClassTests : TestFixtureBase
{
    private MockRepository _mocks;
    private IMyClassDataProvider  _myClassDataProvider;
    private MyClass _myClass;
    private var _vars;

    [SetUp]
    protected void Init()
    {
        _mocks = new MockRepository();
        _myClassDataProvider = _mocks.StrictMock<IMyClassDataProvider >();
        _myClass = _mocks.PartialMock<MyClass>(_myClassDataProvider);
        _vars = "who cares";
    }

    [Test]
    public virtual void ShouldGenerateReport()
    {
        DataSet dataSetToReturn = new DataSet();
        using (_mocks.Ordered())
        {
            Expect.Call(() => _myClass.ValidateWorkingDirectory());
            Expect.Call(_myClassDataProvider.GetData(vars)).Return(dataSetToReturn);
            Expect.Call(() => _myClass.InsertData(dataSetToReturn, "ReportName"));
        }
        _mocks.ReplayAll();
        _myClass.GenerateReport(vars);
        _mocks.VerifyAll();
    }
}

將InsertData從內部更改為公共將解決此問題。 我假設Rhino模擬需要公開一個方法,以便能夠模擬出該方法調用。

關於在期望值之后添加IgnoreArguements,我不太確定如何通過,因為在我嘗試運行此代碼時它仍然調用orignal方法。

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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