簡體   English   中英

如何注入不提供接口和虛擬方法的 class 的假實現?

[英]How to inject a fake implementation of a class providing no interface and no virtual methods?

I'm using the Discord.Net package offering me the DiscordSocketClient class, which currently is a Singleton in my DI container. 我需要實例中的幾種方法

  • Task LoginAsync(TokenType tokenType, string token, bool validateToken = true)
  • Task StartAsync()
  • Task LogoutAsync()
  • Task StopAsync()

鑒於此示例 class 使用方法

public sealed class ConsumingClass
{
    private readonly DiscordSocketClient _discordSocketClient;
    
    public ConsumingClass(DiscordSocketClient discordSocketClient)
    {
        _discordSocketClient = discordSocketClient;
    }
    
    public override async Task Initialize(CancellationToken cancellationToken)
    {
        await _discordSocketClient.LoginAsync(TokenType.Bot, "my-token");
        await _discordSocketClient.StartAsync();
    }
    
    public override async Task TearDown(CancellationToken cancellationToken)
    {
        await _discordSocketClient.LogoutAsync();
        await _discordSocketClient.StopAsync();
    }
}

我想使用 XUnit 和 Moq 創建測試,以確保ConsumingClass的實例按預期工作。

不幸的是, DiscordSocketClient不提供接口,因此我無法為我的測試注入模擬實現。

此外,這些方法不是虛擬的,因此無法創建Mock<DiscordSocketClient>的實例並使用.Setup()來設置模擬實現。

那么如何在我的測試用例中驗證客戶端方法已被調用一次呢? 例如_discordSocketClientMock.Verify(discordSocketClient => discordSocketClient.LoginAsync(), Times.Once());

我是否必須創建一個接口IMyDiscordSocketClient提供這些方法和一個 class 另一個 class MyDiscordSocketClient繼承自DiscordSocketClient並實現接口並使用它? 或者有沒有更好的方法?

如果DiscordSocketClient沒有(公共)虛擬成員,您也不能真正從中派生。 但是,您的最后一個建議可能仍然是您擁有的最好的可能性,除了MyDiscordSocketClient不應該從DiscordSocketClient派生,而是聚合一個。


public class MyDiscordSocketClient: IMyDiscordSocketClient
{
    private DiscordSocketClient _client;
    public MyDiscordSocketClient(DiscordSocketClient client)
    {
        _client = _client;
    }
    
    public async Task Initialize(CancellationToken cancellationToken)
    {
         _client.Initialize(cancellationToken);
    }

    // etc...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM