使用 AWS SDK 和 Moq 时无法对 Mock 的对象进行类型转换
Unable to typecast Mock's object when using the AWS SDK and Moq
我正在尝试围绕将管理与各种 SQS 队列的通信的服务编写单元测试。我无法将模拟版本的 IAmazonSQS 注入我的 class。我有以下构造函数:
private AmazonSQSClient client;
public SqsQueue(IAmazonSQS client, string queueUrl)
{
this.client = (AmazonSQSClient)client;
this.queueUrl = queueUrl;
}
问题行是对 this.client 的赋值。我得到这个异常:Additional information: Unable to cast object of type 'Castle.Proxies.IAmazonSQSProxy' to type 'Amazon.SQS.AmazonSQSClient'.
当我将该行更改为:
this.client = client as AmazonSQSClient;
this.client 设置为空。
这是相关的单元测试代码:
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.
}
我是不是漏掉了什么明显的东西?
我认为问题出在类型转换本身。我将 class 更改为 private IAmazonSQS client
而不是 private AmazonSQSClient client
。这消除了有问题的类型转换的必要性,并允许测试 运行.
我知道你自己回答了,但我想我也会给出我的答案。
问题在于您的构造函数正在接受一个接口,然后您将该接口转换为离散 class。虽然这适用于正常操作,但它不适用于您的单元测试,因为您实际的离散 class 是 而不是 和 AmazonSQSClient
并且与它没有任何关系。 AmazonSQSClient
和您的模拟对象之间唯一的共同点是它们都实现了 IAmazonSQS
接口。
要使用亚马逊客户端,您只需要界面。因此,将您的成员变量更改为接口,并避免强制转换:
private IAmazonSQS client;
public SqsQueue(IAmazonSQS client, string queueUrl)
{
this.client = client;
this.queueUrl = queueUrl;
}
我正在尝试围绕将管理与各种 SQS 队列的通信的服务编写单元测试。我无法将模拟版本的 IAmazonSQS 注入我的 class。我有以下构造函数:
private AmazonSQSClient client;
public SqsQueue(IAmazonSQS client, string queueUrl)
{
this.client = (AmazonSQSClient)client;
this.queueUrl = queueUrl;
}
问题行是对 this.client 的赋值。我得到这个异常:Additional information: Unable to cast object of type 'Castle.Proxies.IAmazonSQSProxy' to type 'Amazon.SQS.AmazonSQSClient'.
当我将该行更改为:
this.client = client as AmazonSQSClient;
this.client 设置为空。
这是相关的单元测试代码:
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.
}
我是不是漏掉了什么明显的东西?
我认为问题出在类型转换本身。我将 class 更改为 private IAmazonSQS client
而不是 private AmazonSQSClient client
。这消除了有问题的类型转换的必要性,并允许测试 运行.
我知道你自己回答了,但我想我也会给出我的答案。
问题在于您的构造函数正在接受一个接口,然后您将该接口转换为离散 class。虽然这适用于正常操作,但它不适用于您的单元测试,因为您实际的离散 class 是 而不是 和 AmazonSQSClient
并且与它没有任何关系。 AmazonSQSClient
和您的模拟对象之间唯一的共同点是它们都实现了 IAmazonSQS
接口。
要使用亚马逊客户端,您只需要界面。因此,将您的成员变量更改为接口,并避免强制转换:
private IAmazonSQS client;
public SqsQueue(IAmazonSQS client, string queueUrl)
{
this.client = client;
this.queueUrl = queueUrl;
}