部分模拟测试在从模拟方法调用调用的私有方法中调用时失败



下面,我有一个要测试的对象的代码。我在测试中使用了部分mock,并希望在测试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 mock需要公开一个方法才能模拟出方法调用。

关于在预期之后添加IgnoreArguments,我不太确定它是如何通过的,因为当我尝试运行此代码时,它仍然调用了original方法。

希望这能帮助

相关内容

  • 没有找到相关文章

最新更新