gpt4 book ai didi

c# - 使用 AWS SDK 和 Moq 时无法对 Mock 的对象进行类型转换

转载 作者:太空宇宙 更新时间:2023-11-03 21:07:16 25 4
gpt4 key购买 nike

我正在尝试围绕将管理与各种 SQS 队列的通信的服务编写单元测试。我无法将 IAmazonSQS 的模拟版本注入(inject)我的类(class)。我有以下构造函数:

private AmazonSQSClient client;

public SqsQueue(IAmazonSQS client, string queueUrl)
{
this.client = (AmazonSQSClient)client;
this.queueUrl = queueUrl;
}

问题行是对 this.client 的赋值。我得到这个异常:附加信息:无法将类型为“CaSTLe.Proxies.IAAmazonSQSProxy”的对象转换为类型“Amazon.SQS.AmazonSQSClient”。当我将该行更改为:

this.client = client as AmazonSQSClient;

this.client 设置为 null。

这是相关的单元测试代码:

public void Setup()
{
this.mockClient = new Mock<IAmazonSQS>();
this.queueUrl = "testUrl";
}

public void GetMessageCount_WhenMessagesExist_ReturnsCount()
{
// Arrange
var sqsQueue = new SqsQueue<IMessage>(this.mockClient.Object, this.queueUrl); // Calls into the constructor above.
}

我是否遗漏了一些明显的东西?

最佳答案

我知道你自己回答了,但我想我也会给出我的答案。

问题是您的构造函数正在接受一个接口(interface),然后您将该接口(interface)转换为一个离散类。虽然这适用于正常操作,但它不适用于您的单元测试,因为您实际的离散类不是 AmazonSQSClient 并且与它没有任何关系。 AmazonSQSClient 和您的模拟对象之间的唯一共同点是它们都实现了 IAAmazonSQS 接口(interface)。

要使用亚马逊客户端,您所需要的只是界面。因此,将您的成员变量更改为接口(interface),并避免强制转换:

private IAmazonSQS client;

public SqsQueue(IAmazonSQS client, string queueUrl)
{
this.client = client;
this.queueUrl = queueUrl;
}

关于c# - 使用 AWS SDK 和 Moq 时无法对 Mock 的对象进行类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40411280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com