Модульное тестирование и утверждение результата

#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, поэтому здесь все может быть по-другому)