Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法键入模拟';当使用AWS SDK和Moq时,请选择s对象_C#_Unit Testing_Amazon Web Services_Moq - Fatal编程技术网

C# 无法键入模拟';当使用AWS SDK和Moq时,请选择s对象

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

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

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;
}

我正要给你一个答案,但你知道了。类应该依赖于抽象(接口/抽象),而不是具体化(类),因此,将具体类作为局部变量仍然意味着该类与实现紧密耦合,而不是抽象。我正要给出答案,但您已经找到了答案。类应该依赖于抽象(接口/抽象),而不是具体化(类),因此将具体类作为局部变量仍然意味着类与实现紧密耦合,而不是抽象。