我的视频服务类别如下:
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 ""
。在断言中,我将其与我从ReadVideoTitle
获得的内容进行比较。但是,这里的断言是什么?由于_fileReader
只是接口,而不是真实的类,因此它不会真正看起来并尝试读取伪造的test.txt
文件并寻找输出。因此,第一个问题是为什么我总是得到test Success
的钱_fileReader.Setup
。如何检查Success
是否?如果真正调用Read的话,它应该不是Vlaidate(),因为它实际上不是测试值吗?任何人都可以这么仁慈地向我解释当前示例测试的工作原理以及什么是真正的测试,因为到目前为止我迷路了。