2014-06-25 54 views
1

我目前在測試我的控制器使用哪個被模擬的方法時遇到問題。它有一個特定枚舉的返回類型。我現在總是從這個模擬方法回來的默認枚舉值,而不是我指定它返回的值。我錯過了什麼嗎?我已經嘗試了Moq和JustMock lite,獲得了相同的結果。下面的JustMock lite例子。如何使用justmock/moq正確地測試enum的返回類型方法

希望我在複製代碼時沒有犯任何錯誤,我已經改變了所有對象的名稱,所以我很抱歉。

這裏是部分單元測試:

 var returnStatus = ExampleEnum.Invalid; 

     //Mock the client 
     var client = Mock.Create<ITestInterface>(); 

     Mock.Arrange(() => client.ValidateSomething(Guid.NewGuid())) 
      .Returns(returnStatus).MustBeCalled(); 


     var testController = new TestController(client); 

     var result = testController.DoSomething(Guid.NewGuid().ToString()) as ViewResult; 

下面是從控制器中的相關位:

 private ITestInterface _client { get; set; } 

     public TestController(ITestInterface client) 
     { 
      _client = client; 
     } 

這是我的控制器操作的一部分:

public ActionResult DoSomething(string id) 
     { 
      Guid token; 
      if(!string.IsNullOrEmpty(id) && Guid.TryParse(id, out token)) 
      { 
       using (var client = _client) 
       { 
        ApplicationUser applicationUser; 
        var status = client.ValidateSomething(token); 

        switch (status) 
        { 

的客戶端被正確模擬,但返回的「status」屬性始終是ExampleEnum.DefaultValue而不是va我已經指定了結果。

我希望我已經提供了足夠的信息。任何幫助非常感謝。

回答

0

你可能做錯了你的設置。

Guid.NewGuid()返回一個新的隨機GUID,因此您用來設置您的模擬的GUID和用於調用DoSomething方法的GUID將永遠不會相同。使用相同的GUID爲模擬和調用DoSomething

var guid = Guid.NewGuid() 
... 
Mock.Arrange(() => client.ValidateSomething(guid)) 
     .Returns(returnStatus).MustBeCalled(); 
... 
var result = testController.DoSomething(guid.ToString()) as ViewResult; 

你應該這樣做。


我不知道JustMock,但起訂量,你也可以簡單地使用It.IsAny匹配所有的GUID:

client.Setup(c => c.ValidateSomething(It.IsAny<Guid>())).Returns(returnStatus); 
+0

非常感謝,這工作一種享受。我認爲這個問題是關於枚舉而不是模擬本身的設置。因此,在安排模擬時,只有在值與傳遞給DoSomething的值相匹配時,纔會返回設置在返回值中的值,除非您使用Moq提及的匹配所有guid。 –

+0

@DanHead是的(我不知道JustMock,但我想它和Moq是一樣的行爲)。 – sloth

相關問題