Вы правы в том смысле, что вам следует проверить доступность внешнего ресурса. Однако вы не трогаете этот ресурс напрямую. Вместо этого вы издеваетесь.
Предположим, что ваш сервис обращается к базе данных и имеет метод ReadCustomerNameById(int id)
. Сначала распакуйте его в интерфейс, который мы назовем IMyService
. Ваш сервис (назовем его MyService
) теперь должен реализовать этот интерфейс. И интерфейс, и ваш сервис выглядят так:
public interface IMyService
{
string ReadCustomerNameById(int id);
}
public class MyService : IMyService
{
public string ReadCustomerNameById(int id)
{
return "Gixabel"; //replace this with your actual implementation
}
}
Теперь нам нужно написать класс, в котором мы можем использовать MyService
и иметь всю бизнес-логику, которая может нам понадобиться. Давайте назовем этот класс Customer
и он будет выглядеть так:
public class Customer
{
private readonly IMyService _service;
public Customer(IMyService service)
{
_service = service;
}
public string CustomerNameById(int id)
{
var result = _service.ReadCustomerNameById(id);
//validate, massage and do whatever you need to do to your response
return result;
}
}
Я использую здесь какое-то внедрение зависимости. Вне контекста.
Теперь мы готовы написать несколько тестов. Найдите и установите Nuget с именем Moq
. Мне лично нравится nUnit
, но вы можете легко перевести этот образец на MSTest
или любой другой.
Мы начинаем объявлять наш класс Customer
и макет MyService
. Затем мы создаем экземпляр Customer
и макет IMyService
в нашей настройке.
Теперь мы делаем нормальный тест, в котором мы предполагаем, что MyService
работает правильно.
Последний тест интересный. Мы заставляем сервис генерировать исключение и утверждаем, что это действительно так.
[TestFixture]
public class CustomerTests
{
private Customer _customer;
private Mock<IMyService> _myService;
[SetUp]
public void Initialize()
{
_myService = new Mock<IMyService>();
_customer = new Customer(_myService.Object);
}
[Test]
public void GivenIdWhenCustomerNameByIdThenCustomerNameReturned()
{
const int id = 10;
const string customerName = "Victoria";
_myService.Setup(s => s.ReadCustomerNameById(id)).Returns(customerName);
var result = _customer.CustomerNameById(id);
Assert.AreEqual(result, customerName);
}
[Test]
public void GivenIdWhenCustomerNameByIdThenException()
{
_myService.Setup(s => s.ReadCustomerNameById(It.IsAny<int>())).Throws<Exception>();
Assert.Throws<Exception>(() => _customer.CustomerNameById(10));
}
}
Теперь вы полностью отделены от службы, которую пытаетесь использовать. Теперь вы можете выполнять фиксацию в GitHub, Azure Devops и т. Д. И запускать тесты без каких-либо внешних зависимостей.
Кроме того, вы можете попробовать / перехватить, обработать сообщения об ошибках и протестировать их. Но это должно помочь вам.
В качестве примечания попробуйте FluentAssertions
. Он читается лучше, чем «Assert.AreEqual ...»