Чтобы выполнить модульное тестирование этого метода в отдельности, необходимо протестировать зависимости тестируемого класса.
Принимая пример, подобный следующему
public class MySubjectClass {
private readonly Container container;
public MySubjectClass(Container container) {
this.container = container;
}
public async Task AddSignalRConnectionAsync(ConnectionData connection) {
if (connection != null) {
var partisionKey = new PartitionKey(connection.ConnectionId);
await this.container.CreateItemAsync<ConnectionData>(connection, partisionKey);
}
}
}
В приведенном вышеНапример, тестируемый метод зависит от Container
и ConnectionData
, которые необходимо указать при тестировании.
Если вы не хотите использовать фактический экземпляр Container
, рекомендуется использовать макетзависимости, которые могут иметь нежелательное поведение, если используется фактическая реализация.
public async Task Should_CreateItemAsync_When_ConnectionData_NotNull() {
//Arrange
//to be returned by the called mock
var responseMock = new Mock<ItemResponse<ConnectionData>>();
//data to be passed to the method under test
ConnectionData data = new ConnectionData {
ConnectionId = "some value here"
};
var containerMock = new Mock<Container>();
//set the mock expected behavior
containerMock
.Setup(_ => _.CreateItemAsync<ConnectionData>(
data,
It.IsAny<PartitionKey>(),
It.IsAny<ItemRequestOptions>(),
It.IsAny<CancellationToken())
)
.ReturnsAsync(responseMock.Object)
.Verifiable();
var subject = new MySubjectClass(containerMock.Object);
//Act
await subject.AddSignalRConnectionAsync(data);
//Assert
containerMock.Verify(); //verify expected behavior
}
Проверяемый метод объекта может быть проверен на то, что он вызовет ожидаемый метод, когда параметр не равен нулю, на основе указанного выше изолированного модульного тестапример.
Использование действительного Container
сделало бы это интеграционным тестом, который потребовал бы другого типа схемы тестирования.