2014-06-11 20 views
6

我有幾個方法的接口。我有這個接口的默認實現。爲了進行集成測試,我希望創建一個模擬實現,如果調用其中一個方法,它將返回我的自定義值,否則將返回到默認實現。 Moq有可能嗎,還是我應該自己創建一個簡單的存根?如何使用Moq提供方法實現?

IInterface default = new DefaultImplementation(); 
var mock = new Mock<IInterface>(); 
mock.Setup(i => i.Method(It.IsAny<>())).Calls(p => p==0 ? return 5 : default.Method(p);); 

TheMethodITest(mock.Object()); //if it calls the object with 0 then it should get 5, otherwise it should call the default object 
+0

你可以提供一個代碼示例? – Ian

+0

我不清楚你的意思是什麼*,並且會退回到默認實現,否則*。如果未調用此方法,何時可以觸發? –

+0

@Ian,在問題 – Grzenio

回答

5

我不知道什麼是默認提供或您的特定值的條件。不過,這聽起來像是你想用Delegator設置一個模擬實例。

public void MoqCanBeSetupWithDelegator() 
{ 
    var mock = new Mock<IInterface>(); 
    Func<string, int> valueFunction = i => i == "true" ? 1 : default(int); 
    mock.Setup(x => x.Method(It.IsAny<string>())).Returns(valueFunction); 

    Assert.Equal(1, mock.Object.Method("true")); 
    Assert.Equal(0, mock.Object.Method("anonymous")); 
} 

public interface IInterface 
{ 
    int Method(string arg); 
} 

正如可以看到的,Returns方法被重載以接受一個返回值(int)或委託者表示模擬的方法簽名。您可以使用Func<string, int>來替換實際的實現 - int Method(string arg)

+0

此外,內聯實現此功能並不直觀。爲了達到這個目的,你需要在lambda表達式中指定參數的類型。例如'...返回((字符串i)=> i ==「true」?1:default(int));'沒有指定'(字符串i)'編譯器不能告訴您嘗試調用哪種方法重載。 – robbymurphy

+0

如果方法「返回」無效怎麼辦?沒有'Returns()'方法,然後...... :( – user2173353

2

您可以通過將模擬設置爲具體的類並使用As()來檢索在其上完成設置的基礎IInterface來執行此操作。然後,您可以硬鑄鐵mock.Object調用底層的具體目標:

[Test] 
    public void SomeTest() 
    { 
    var mock = new Mock<DefaultImplementation>().As<IInterface>(); 
    mock.Setup(i => i.Method(It.IsAny<int>())) 
     .Returns<int>(p => p == 0 
           ? 5 
           : ((DefaultImplementation)mock.Object).Method(p)); 

    TheMethodITest(mock.Object); 
    } 

這是我與測試設置的休息,FWIW:

public interface IInterface 
{ 
    int Method(int p); 
} 
public class DefaultImplementation : IInterface 
{ 
    public int Method(int p) 
    { 
     return 6; 
    } 
} 
[TestFixture] 
public class SomeFixture 
{ 
    public static void TheMethodITest(IInterface dep) 
    { 
     for (var i = 0; i < 10; i++) 
     { 
     Debug.WriteLine("{0}:{1}",i, dep.Method(i)); 
     } 
    } 
} 
相關問題