我在模擬回傳IHttpClient. 這是客戶的要求,我無法更改實作。
代碼看起來像這樣:
代表:
namespace Foo.Http
{
public delegate IHttpClient FooHttpClientProvider(string name);
}
測驗類:
[SetUp]
public void SetUp()
{
Mock<FooHttpClientProvider>().Setup(x => x("HttpClient")).Returns(Mock<IHttpClient>().Object);
}
當我這樣做時,我得到以下例外:
System.InvalidCastException : Unable to cast object of type 'Foo.Http.FooHttpClientProvider' to type 'Moq.IMocked`1[Foo.Http.FooHttpClientProvider]'.
有任何想法嗎?這甚至可能嗎?
編輯:一些額外的資訊:我需要測驗的服務被注入了 FooHttpClientProvider。我們使用帶有 Autofac 的全域 Mock 來注冊我們需要的服務。由于我無法將提供程式作為引數傳遞,因此我無法為 FooHttpClientProvider 實體化新的 Mock 并將其作為引數傳遞給我的服務;我需要在全域模擬中設定它。這使事情進一步復雜化。
該服務的代碼如下所示:
private readonly FooHttpClientProvider _client;
public FooService(
FooHttpClientProvider fooClient)
{
_client = fooClient("HttpClient");
}
public async Task<OutputDto> GetAsync(Request request)
{
var accessToken = await _AuthService.GetAccessTokenAsync();
try
{
var response =
await ExecuteGet<OutputDto>(
$"{FooConfig.BaseUrl}someEntpoint{GetQueryParams(request)}", accessToken);
return response;
}
catch(Exception ex)
{
//Exception handling
}
}
服務本身作業正常。只有在嘗試模擬它進行單元測驗時才會出現問題。
uj5u.com熱心網友回復:
這很可能是XY 問題。
無需嘲笑代表。使用回傳模擬的實際委托IHttpClient
[SetUp]
public void SetUp() {
Mock<IHttpClient> clientMock = new Mock<IHttpClient>();
//... set up the client mock to behave as needed
FooHttpClientProvider provider = (string name) => clientMock.Object;
//... use created delegate as needed with the subject under test
FooService subject = new FooService(provider);
}
呼叫主體建構式的位置
//...
public FooService(FooHttpClientProvider fooClient) {
_client = fooClient("HttpClient");
//...
}
//...
在測驗中創建的委托將呼叫并回傳模擬的 IHttpClient
uj5u.com熱心網友回復:
我能夠解決這個問題。事實證明,將 IHttpClient 模擬到我的全域 Mock 物件中,僅此一項就足以讓我進入我的 DI 容器。像魅力一樣作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/407219.html
標籤:
