Как издеваться над объектом CreateBatchWrite в Xunit

#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>, который не может быть создан.