C# 无法键入模拟';当使用AWS SDK和Moq时,请选择s对象
我试图围绕一个服务编写单元测试,该服务将管理与各种SQS队列的通信。我无法将IAMAzonsq的模拟版本注入到我的类中。我有以下构造函数:C# 无法键入模拟';当使用AWS SDK和Moq时,请选择s对象,c#,unit-testing,amazon-web-services,moq,C#,Unit Testing,Amazon Web Services,Moq,我试图围绕一个服务编写单元测试,该服务将管理与各种SQS队列的通信。我无法将IAMAzonsq的模拟版本注入到我的类中。我有以下构造函数: private AmazonSQSClient client; public SqsQueue(IAmazonSQS client, string queueUrl) { this.client = (AmazonSQSClient)client; this.queueUrl = queueUrl; } 问题行是分配给this.clien
private AmazonSQSClient client;
public SqsQueue(IAmazonSQS client, string queueUrl)
{
this.client = (AmazonSQSClient)client;
this.queueUrl = queueUrl;
}
问题行是分配给this.client的任务。我遇到此异常:其他信息:当我将该行更改为以下内容时,无法将类型为“Castle.Proxies.iamazonsqsproy”的对象强制转换为类型为“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.
}
公共作废设置()
{
this.mockClient=new Mock();
this.queueUrl=“testUrl”;
}
public void GetMessageCount_当消息存在时_ReturnsCount()
{
//安排
var sqsQueue=new sqsqqueue(this.mockClient.Object,this.queueUrl);//调用上面的构造函数。
}
我是否遗漏了一些明显的东西?我认为问题在于打字本身。我将我的类更改为拥有
私有IAmazonSQS客户端
,而不是私有Amazonsqs客户端
。这就消除了有问题的类型转换的必要性,并允许测试运行。我认为问题在于类型转换本身。我将我的类更改为拥有私有IAmazonSQS客户端
,而不是私有Amazonsqs客户端
。这就消除了有问题的类型转换的必要性,并允许测试运行。我知道你自己回答了,但我想我也会给出我的答案
问题是您的构造函数正在接受一个接口,然后您正在将该接口强制转换为一个离散类。虽然这适用于正常操作,但它在单元测试中不起作用,因为实际的离散类是非一个AmazonSQSClient
,与它没有关系。AmazonSQSClient
和您的模拟对象之间唯一的共同点是它们都实现了IAmazonSQS
接口
要使用Amazon客户端,您所需要的只是界面。因此,将您的成员变量更改为接口,并避免强制转换:
private IAmazonSQS client;
public SqsQueue(IAmazonSQS client, string queueUrl)
{
this.client = client;
this.queueUrl = queueUrl;
}
我知道你自己回答了,但我想我也会给出我的答案 问题是您的构造函数正在接受一个接口,然后您正在将该接口强制转换为一个离散类。虽然这适用于正常操作,但它在单元测试中不起作用,因为实际的离散类是非一个
AmazonSQSClient
,与它没有关系。AmazonSQSClient
和您的模拟对象之间唯一的共同点是它们都实现了IAmazonSQS
接口
要使用Amazon客户端,您所需要的只是界面。因此,将您的成员变量更改为接口,并避免强制转换:
private IAmazonSQS client;
public SqsQueue(IAmazonSQS client, string queueUrl)
{
this.client = client;
this.queueUrl = queueUrl;
}
我正要给你一个答案,但你知道了。类应该依赖于抽象(接口/抽象),而不是具体化(类),因此,将具体类作为局部变量仍然意味着该类与实现紧密耦合,而不是抽象。我正要给出答案,但您已经找到了答案。类应该依赖于抽象(接口/抽象),而不是具体化(类),因此将具体类作为局部变量仍然意味着类与实现紧密耦合,而不是抽象。