[英]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.
}
我在這里錯過明顯的東西嗎?
我知道您會自動回答,但我想我也會給出答案。
問題在於您的構造函數正在接受一個接口,然后將該接口轉換為離散類。 盡管這對於正常操作是有效的,但在您的單元測試中將不起作用,因為您實際的離散類不是 AmazonSQSClient
且AmazonSQSClient
沒有任何關系。 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.