2011-09-27 70 views
0

我只是在與Moq玩耍,我無法弄清楚如何撥打Verify來按預期工作。我的問題似乎是我在SUT上調用的方法沒有被調用。這裏是我的代碼進行測試:初學者Moq關於驗證的問題

public class ImageHandler : BaseHttpHandler 
{ 
    public override void ProcessRequest(HttpContextBase context) 
    { 
     var person = new Person(); 

     this.DoPerson(person); 

     context.Response.ContentType = "image/jpeg"; 

     if (context.Request.RawUrl.ToLower().Contains("jellyfish.jpg")) 
     { 
      context.Response.TransmitFile(@"C:\Temp\jf.jpg"); 
     } 
     else if (context.Request.RawUrl.ToLower().Contains("koala.jpg")) 
     { 
      context.Response.TransmitFile(@"C:\Temp\k.jpg"); 
     } 
     else 
     { 
      context.Response.Write("File not found."); 
     } 

    } 

    public virtual void DoPerson(Person person) 
    { 

    } 
} 

這裏是我的MSpec測試:

[Subject("Process")] 
public class When_Given_Person 
{ 
    private static Mock<HttpContextBase> httpContext; 

    private static Mock<HttpRequestBase> httpRequest; 

    private static Mock<HttpResponseBase> httpResponse; 

    private static Mock<ImageHandler> mockSut; 

    private static BaseHttpHandler sut; 

    private Establish context =() => 
    { 
     httpContext = new Mock<HttpContextBase>(); 
     httpResponse = new Mock<HttpResponseBase>(); 
     httpRequest = new Mock<HttpRequestBase>(); 
     mockSut = new Mock<ImageHandler>(); 

     httpContext.SetupGet(context => context.Response).Returns(httpResponse.Object); 
     httpContext.SetupGet(context => context.Request).Returns(httpRequest.Object); 

     httpRequest.SetupGet(r => r.RawUrl).Returns("http://logicsoftware/unkown.jpg"); 

     sut = mockSut.Object; 
    }; 

    private Because of =() => sut.ProcessRequest(httpContext.Object); 

    private It should_call_person_with_expected_age =() => 
     { 
      mockSut.Verify(s => s.DoPerson(Moq.It.IsAny<Person>()),Times.AtLeastOnce()); 
     }; 
} 

這是很基本的東西,沒有什麼太花哨。現在,當我運行測試,我得到:

上模擬預期調用至少一次,但從來沒有 執行:S => s.DoPerson(It.IsAny())沒有配置設置。

我相信這是由於這樣的事實:sut.ProcessRequest()實際上不叫 - 我有一個斷點的ProcessRequest()的開始,但它從來沒有擊中。有人可以告訴我如何設置我的mockSut,以便調用ProcessRequest()

乾杯。 Jas。

回答

2

當你使用Moq創建一個對象的Mock時,它會模擬整個對象並將其設置爲返回默認值,或者對每個方法和屬性執行任何操作。所以sut.ProcessRequest,實際上不會做任何事情:DoPerson將永遠不會被調用。

你只想嘲笑你想測試的類的依賴關係,而不是類本身。

+0

我在RhinoMocks上試了這個相同的場景,並且運行得相當快。不是說Moq是廢話,但我覺得它設置和運行有點煩瑣。我通常使用TypeMock,但由於工作的變化,我需要開始使用開源的模擬框架。 –