2012-02-06 2 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();. 문제가 사라집니다. 누군가가 그렇게 설명 할 수 있습니까? –

답변

1

내부에서 공용으로 InsertData를 변경하면이 문제가 해결됩니다. 메소드 호출을 조롱 할 수 있도록 Rhino 모의 객체를 공개해야한다고 가정합니다.

IgnoreArguements를 예상 한 후에 추가하는 것에 대해서는이 코드를 실행하려고 시도 할 때 여전히 orignal 메서드를 호출했기 때문에이 코드가 어떻게 전달되었는지 잘 모르겠습니다.

희망이 내가 라인을 업데이트 할 때