繁体   English   中英

使用AWS开发工具包和Moq时无法类型转换Mock的对象

[英]Unable to typecast Mock's object when using the AWS SDK and Moq

我试图围绕服务编写单元测试,该服务将管理与各种SQS队列的通信。 我无法将模拟的IAmazonSQS版本注入我的班级。 我有以下构造函数:

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设置为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.
} 

我在这里错过明显的东西吗?

我知道您会自动回答,但我想我也会给出答案。

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

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

private IAmazonSQS client;

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

我相信问题是打字本身。 我将类更改为具有private IAmazonSQS client而不是private AmazonSQSClient client 这消除了有问题的类型转换的必要性,并允许运行测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM