2012-02-06 79 views
0

调用的。下面,我有我想要测试的对象的代码。 我在测试中使用了部分模拟,并且想在我测试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(); 
    } 
} 
+0

当我更新行: Expect.Call(()=> _myClass.InsertData(dataSetToReturn “REPORTNAME”))IgnoreArguments(); 问题消失。有人可以解释一下吗? – 2012-02-06 12:56:23

回答

1

将InsertData从内部更改为公开将解决此问题。我假设一个方法需要公开犀牛嘲笑能够嘲笑方法调用。

关于在期望后添加IgnoreArguements,我不太确定这是如何通过的,因为它在我尝试运行此代码时仍然调用orignal方法。

希望这有助于