2016-04-21 57 views
2

我是MOQ和Mocking的新手。
假設我有這樣的一類,與變化的值一個void方法:MOQ模擬無效方法,改變字段值

public class Sample 
{ 
    public virtual int Number { get; set; } 

    public virtual void Check(int a) 
    { 
     this.Number = a > 10 ? this.Number = 100 : this.Number = 200; 
    } 
} 

我想測試的空白方法,以確保它是改變局部場Number

[Fact] 
public void TestSampleClass() 
{ 
    var sut = new Mock<Sample>(); 
    sut.Setup(s => s.Number).Returns(50);   

    sut.Setup(s => s.Check(It.IsAny<int>())).Callback(
     (int testNumber) => 
     { 
      if (testNumber > 10) 
      { 
       sut.Setup(s => s.Number).Returns(100); 
      } 
      else 
      { 
       sut.Setup(s => s.Number).Returns(200); 
      }     
     }); 
} 

看來,如果我打印sut.Object.Number它給人的初始值,而不是無效呼叫之後更新的一個方法不改變值100或200 ...... 。

+0

我不知道你的問題的答案,但我注意到'this.Number = a> 10? this.Number = 100:this.Number = 200;'可以縮短爲'this.Number = a> 10? 100:200;'。 –

+1

我真的不需要嘲笑這堂課,這看起來是完全可以測試的,不需要使用嘲諷 – Kritner

+0

是@Kritner這很容易測試而不嘲笑。但是我的原創課太複雜了,不適合這裏。我想簡化我的問題找到一個helloworld解決方案 –

回答

2

除非你的例子是一個更復雜問題的簡化表示,否則不需要模擬Sample類。

[Fact] 
public void TestSampleClass() 
{ 
    //Arrange 
    var testNumber = 5; //Could be what ever number you want to test 
    var expected = 200 
    var sut = new Sample(); 

    //Act 
    sut.Check(testNumber); 
    var actual = sut.Number; 

    //Assert 
    Assert.AreEqual(expected, actual); 
} 

如果意圖是要學會如何在這種特殊情況下進行這樣的測試,那麼你可以做這樣的事情......

假設你想測試的Check方法如下界面上...

public interface ISample { 
    int Number { get; set; } 
    void Check(int a); 
} 

在預期的行爲是有方法改變使用Moq屬性的值,那麼這就是你如何設置。

[Fact] 
public void TestISampleCheck() { 
    //Arrange 
    var testNumber = 5; //Could be what ever number you want to test 
    var expected = 200; 
    var mock = new Mock<ISample>(); 

    //Specifies that the all properties on the mock should have "property behavior", 
    //meaning that setting its value will cause it to be saved and later returned 
    //when the property is requested. (this is also known as "stubbing"). The default 
    //value for each property will be the one generated as specified by the Moq.Mock.DefaultValue 
    //property for the mock. 
    mock.SetupAllProperties(); 

    var sut = mock.Object; 

    mock.Setup(s => s.Check(It.IsAny<int>())) 
     .Callback((int a) => { 
      if (a > 10) { 
       sut.Number = 100; 
      } else { 
       sut.Number = 200; 
      } 
     }); 

    //Act 
    sut.Check(testNumber); 
    var actual = sut.Number; 

    //Assert 
    Assert.AreEqual(expected, actual); 
} 
+0

欣賞它很多@Nkosi。你的描述真的很有幫助。我不知道爲什麼我的價值總是Moq.Mock.DefaultValue。 我不知道有關stubbing :)。 再次感謝 –

+0

沒問題。樂意效勞。謝謝。 – Nkosi

0

Callback方法只是設置方法的行爲,做一些改變,你實際上需要調用模擬方法,即sut.Object.Check(11);,那麼你可以斷言你的結果。

+0

這不工作,因爲Nkosi解決sut.Object.Check(11);顯示Moq.Mock.DefaultValue。我應該用stubbing –