2016-08-23 115 views
0

如果我在該類中使用擴展方法,如何用單元測試的接口替換具體類?將接口抽象爲具有擴展方法的類

我有一個方法:

[HttpGet] 
[Route("/yoyo/{yoyoId:int}/accounts")] 
public ResponseYoyoEnvelope GetAccountsByYoyoId([FromBody] RequestYoyoEnvelope requestYoyoEnvelope, int yoyoId) 
{ 
    var responseYoyoEnvelope = requestYoyoEnvelope.ToResponseYoyoEnvelope(); 

    // get our list of accounts 
    // responseEnvelope.Data = //list of accounts 
    return responseYoyoEnvelope; 
} 

我想更換:

RequestYoyoEnvelope requestYoyoEnvelope 

與抽象:

IRequestYoyoEnvelope requestYoyoEnvelope 
然而

ToResponseYoyoEnvelope是一個擴展方法。

如果我在該類中使用擴展方法,如何用單元測試的接口替換具體類?

回答

2

假設

public class RequestYoyoEnvelope : IRequestYoyoEnvelope { ... } 

你的擴展方法需要針對接口

public static ResponseYoyoEnvelope ToResponseYoyoEnvelope(this IRequestYoyoEnvelope target) { ... } 

保持行動是因爲該模型粘結劑將有問題的結合界面。

在您的單元測試中,您傳遞RequestYoyoEnvelope的具體實現,並且應該能夠測試更新後的擴展方法。

從您的示例中,您不需要接口來測試該方法是否是待測試的方法。只需在模型測試過程中新建一個模型實例並將其傳遞給該方法即可。

[TestMethod] 
public void GetAccountsByYoyoIdTest() { 
    //Arrange 
    var controller = new YoyoController(); 
    var yoyoId = 123456; 
    var model = new RequestYoyoEnvelope { 
     //you populate properties for test 
    }; 
    //Act 
    var result = controller.GetAccountsByYoyoId(model, yoyoId); 

    //Assert 
    //...do your assertions. 
} 
+0

我調整了我的答案,一旦我意識到我錯過了 - 這是一個API端點。然後我讀了這個答案 - @Nkosi不會錯過它,而且這個答案更重要。 –

4

您可以編寫針對接口而不是具體類的擴展方法:

public static class Class2 
{ 
    public static void Extension(this ITestInterface test) 
    { 
     Console.Out.WriteLine("This is allowed"); 
    } 
} 

然後,你可以這樣做:

// "Test" is some class that implements the ITestInterface interface 
ITestInterface useExtensionMethod = new Test(); 
useExtensionMethod.Extension(); 

注意過,這還是會工作,即使如果useExtensionMethod不是明確的類型ITestInterface

Test useExtensionMethod = new Test(); 
useExtensionMethod.Extension(); 

這裏有controversy關於這是否表示Decorator模式,但請記住Extension方法不是字面上的接口本身的一部分 - 「引擎蓋下」it's still a static method「,它只是讓編譯器允許您像實例方法一樣對待這個方便。