簡體   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