#c# #moq #xunit #aws-sdk-net
#c# #moq #xunit #aws-sdk-net
Вопрос:
Я пишу модульный тест на c #, и мне нужно смоделировать ответ CreateBatchWrite с использованием Moq, но не могу создать экземпляр объекта объекта BatchWrite. Я делаю это: _dbContext.Setup(m => m.CreateBatchWrite<type>(It.IsAny<DynamoDBOperationConfig>())) .Returns(Mock.Of<BatchWrite<type>>());
В настоящее время я пытаюсь это сделать, но получаю ошибку: System.NotSupportedException: Parent does not have a default constructor. The default constructor must be explicitly defined.
кто-нибудь может мне помочь в этом?
Ответ №1:
Поскольку у BatchWrite нет конструктора по умолчанию, вы должны обернуть его в другой класс, которым вы можете управлять, то есть в класс с конструктором по умолчанию…
Например:
public class BatchWriteWrapper<T>
{
private readonly BatchWrite<T> _batchWrite;
public BatchWriteWrapper()
{ }
public BatchWriteWrapper(BatchWrite<T> batchWrite)
{
_batchWrite = batchWrite;
}
public void MethodFromBatchWrite()
{
_batchWrite.MethodFromBatchWrite();
}
// etc.
}
Теперь в вашем коде вы можете создать экземпляр своего класса-оболочки с помощью экземпляра BatchWrite и протестировать его на экземпляре-оболочке.
Ваш _dbContext
можно настроить следующим образом:
_dbContext.Setup(m => m.CreateBatchWrite<type>(It.IsAny<DynamoDBOperationConfig>()))
.Returns(Mock.Of<BatchWriteWrapper<type>>());
И в вашем коде вы оборачиваете любой BatchWrite
полученный экземпляр и вместо этого используете оболочку:
var batchWrite = new BatchWriteWrapper(_dbContext.CreateBatchWrite<type>(...));
Если вы хотите сделать еще один шаг, вы также можете обернуть свой тип _dbContext
, чтобы он возвращал завернутые экземпляры вместо своих собственных (не поддающихся редактированию) экземпляров.
Комментарии:
1. Можете ли вы объяснить на примере?
2. Это не помогает, поскольку это объект BatchWrite<T>, который не может быть создан.