#c#
#c#
Вопрос:
У меня есть класс видеосервиса следующим образом:
public class VideoService
{
private IFileReader _fileReader;
private IVideoRepository _repository;
public string _videoPath;
public VideoService(IFileReader fileReader, IVideoRepository repository)
{
_fileReader = fileReader;
_repository = repository;
}
public string ReadVideoTitle()
{
var str = _fileReader.Read(_videoPath);
if (str == "")
{
return "";
}
else
{
return "b";
}
}
}
затем есть IFileReader и FileReader, как показано ниже:
public interface IFileReader
{
string Read(string path);
}
public class FileReader : IFileReader
{
public string Read(string path)
{
return File.ReadAllText(path);
}
}
Теперь у меня есть свой модульный тест:
[TestFixture]
public class VideoServiceTests
{
private VideoService _videoService;
private Mock<IFileReader> _fileReader;
private Mock<IVideoRepository> _repository;
private string _videoPath;
[SetUp]
public void SetUp()
{
_fileReader = new Mock<IFileReader>();
_repository = new Mock<IVideoRepository>();
_videoPath = @"test.txt";
_videoService = new VideoService(_fileReader.Object, _repository.Object);
}
[Test]
public void ReadVideoTitle_EmptyFile_ReturnError()
{
_fileReader.Setup(fr => fr.Read(_videoPath)).Returns("");
var result = _videoService.ReadVideoTitle();
Assert.That(result, Does.Contain("").IgnoreCase);
}
Моя проблема в том, чего я не понимаю. Когда я делаю _fileReader.Setup ..
Насколько я понимаю, это поддельный ридер, а не FileReader class
правильный?, поэтому, когда я говорю поместить что угодно в Read
параметр типа: test.txt
, тогда я говорю, что ожидаю Returns ""
. В Assert я сравниваю это с тем, что я получаю от ReadVideoTitle
. Однако в чем смысл утверждения здесь? Поскольку _fileReader
это просто интерфейс, а не реальный класс, он на самом деле не будет искать и пытаться прочитать поддельный test.txt
файл и искать выходные данные. Поэтому первый вопрос, почему я всегда получаю test Success
все, что я вкладываю _fileReader.Setup
. Как это проверяет, является ли Success
? Должно ли это быть просто Vlaidate(), если Read действительно вызывался, поскольку это nt действительно проверяет значения? Кто-нибудь может быть так добр и объяснить мне, как работает текущий пример теста и что на самом деле тестируется, потому что пока я заблудился.
Комментарии:
1. Ненулевая строка всегда содержит пустую строку. Вы должны проверить, равно ли оно пустой строке.
IgnoreCase
не имеет значения при тестировании с пустой строкой.2. можете ли вы объяснить, действительно ли при настройке моего moc устанавливается _videoPath и говорится, что возвращаемое значение этого средства чтения файлов равно «», которое возвращает set in? Означает в ReadVideoTitle здесь: var str = _fileReader.Read(_videoPath); это действительно взято из того, что я настроил в Setup() ?
3.Насколько я понимаю, если
.Read(..)
вызывается с помощью_videoPath
, то оно вернет""
, а не то, что оно будет вызвано с его помощью. Реальный параметр передается вашейVideoService
реализацией при вызовеRead
. (Примечание: я привык к NSubsitute, поэтому здесь все может быть по-другому)