Поэтому я пытаюсь протестировать хранилище таблиц Azure и высмеивать вещи, от которых я зависю.Мой класс структурирован таким образом, что я устанавливаю соединение в конструкторе, то есть я создаю новый экземпляр CloudStorageAccount
, в котором я создаю экземпляр StorageCredentials
, который имеет storageName
и storageKey
.После этого я создаю экземпляр CloudTable
, который я использую далее в коде для выполнения операций CRUD.Мой класс выглядит следующим образом:
public class TableStorage : ITableStorage
{
private const string _records = "myTable";
private CloudStorageAccount _storageAccount;
private CloudTable _table;
private ILogger<TableStorage> _logger;
public AzureTableStorageService(ILogger<TableStorage> loggingService)
{
_storageAccount = new CloudStorageAccount(new StorageCredentials(
ConfigurationManager.azureTableStorageName, ConfigurationManager.azureTableStorageKey), true);
_table = _storageAccount.CreateCloudTableClient().GetTableReference(_records);
_table.CreateIfNotExistsAsync();
_logger = loggingService;
}
//...
//Other methods here
}
_table
повторно используется в классе для разных целей.Моя цель состоит в том, чтобы издеваться над ним, но, поскольку он является виртуальным и не реализует никакого интерфейса, я не могу найти простое решение Mock
, такое как:
_storageAccount = new Mock<CloudStorageAccount>(new Mock<StorageCredentials>(("dummy", "dummy"), true));
_table = new Mock<CloudTable>(_storageAccount.Object.CreateCloudTableClient().GetTableReference(_records));
Поэтому, когда я пытаюсьПостроить мой модульный тест таким образом, я получаю: Type to mock must be an interface or an abstract or non-sealed class.
Моя цель заключается в достижении чего-то вроде:
_table.Setup(x => x.DoSomething()).ReturnsAsync("My desired result");
Любые идеи высоко ценятся!