У меня есть только следующие входные данные: интерфейс и класс. У меня нет класса, который реализует интерфейс, никаких данных о клиенте, его идентификаторах и других данных. Только следующее:
public interface IService
{
double GetData(int clientId);
}
public class ClientInfo
{
private int _clientId;
private IService _svc;
public double MoneySun;
public ClientInfo(int clientId, IService svc)
{
_clientId = clientId;
_svc = svc;
}
public void UpdateMoney()
{
MoneySun = _svc.GetData(_clientId);
}
}
И мне нужно написать Unit-тест для метода UpdateMoney (учитывая, что у меня есть только информация, опубликованная выше)
Я написал следующий тест и хотел бы проконсультироваться, правильно это или нет?
[Test]
public void GetData()
{
Mock<IService> moqSvc = new Mock<IService>();
var сInfo = new ClientInfo(1, moqSvc.Object);
сInfo.UpdateMoney();
Assert.Greater(сInfo.MoneySun, -1);
}
А также, делая Assert, я только догадываюсь, что это должно быть больше, чем -1, поэтому я не совсем уверен, правильно ли это. Также я предполагаю, что есть clientId = 1
Поскольку вы тестируете фасад/прокси-сервер службы, насмехаясь над интерфейсом службы, вы сможете определить, правильно ли взаимодействует с издеваемым интерфейсом (необходимо выполнить единичные тесты на другом конце провода для фактического обслуживания, чтобы убедиться, что правильная транзакция была выполнена клиенту).
Вы также можете проверить, что состояние сут (ClientInfo
) согласовано до и после вызова:
[Test]
public void GetData()
{
var moqSvc = new Mock<IService>();
// Provide some fake data to ensure that the SUT uses the return value correctly
moqSvc.Setup(x => x.GetData(It.IsAny(int))).Returns(123.45);
var сInfo = new ClientInfo(1, moqSvc.Object);
// Ensure correct initial state
Assert.AreEqual(0, cInfo.MoneySun)
сInfo.UpdateMoney();
// Ensure correct final state
Assert.AreEqual(123.45, cInfo.MoneySun)
// Ensure correct interaction with the service
moqSvc.Verify(x => x.GetData(1), Times.Once);
moqSvc.Verify(x => x.GetData(It.IsAny<int>(i => i != 1)), Times.Never);
}