2016-12-08 62 views
1

我像一個簡單的方法:起訂量設定單元測試

public class MyService : IMyService 
{ 
    public int Add(int x, int y) 
    { 
     return x + y; 
    } 
} 

public interface IMyService 
{ 
    int Add(int x, int y); 
} 

和我寫了一個單元測試的是上述方法:

public void PassingTest() 
{ 
    var mock = new Mock<IMyService>(); 

    mock.Setup(x => x.Add(It.IsAny<int>(), It.IsAny<int>())).Returns<int, int>((x, y) => { return x + y; }); 

    var svc = mock.Object; 

    var result = svc.Add(3, 3); 
    var result2 = svc.Add(2, 5); 
    result.Should().Be(6); 
    result2.Should().Be(7); 
} 

這段代碼是好的?我爲什麼要寫Returns這個和整個方法幾乎相同的語句?

+0

如果'IMyService'被用作依賴於你想測試的另一個類的話,你只會這樣做。如果'IMyService'是被測試的系統,那麼你不會因爲你不想模擬你正在測試的系統。您使用目標類的實際實例 – Nkosi

回答

0

如果IMyService被用作您想要測試的另一個類的依賴關係,那麼您只會這樣做。如果IMyService是被測系統,那麼你不會因爲你沒有模擬你正在測試的系統。您使用目標類的實際實例。

讓我們來說一個非常簡單的例子,我們有這樣的一個類。

public class SomeClass { 
    public SomeClass(IMyService service) { 
     this.service = service; 
    } 
    private readonly IMyService service; 

    public int SomeMethodThatUsesMyService(int input) { 
     int someConstant = 10; 

     var result = service.Add(someConstant, input); 
     return result; 
    } 
} 

如果IMyService實施做一些處理是IO依賴,是非常困難的,以測試自己的。然後一個嘲諷的IMyService將有助於嘗試測試該類。

[Fact] 
public void Given_Input_SomeMethodThatUsesMyService_Should_Increase_By_Ten() { 
    //Arrange 
    var expected = 14; 

    var mock = new Mock<IMyService>(); 

    mock.Setup(x => x.Add(It.IsAny<int>(), It.IsAny<int>())).Returns<int, int>((x, y) => { return x + y; }); 

    var svc = mock.Object; 

    var sut = new SomeClass(svc); 

    //Act 
    var result = sut.SomeMethodThatUsesMyService(4); 

    //Assert 
    result.Should().Be(expected); 
}