如何模拟txt输出?

How to mock txt output?

我有一个 txt,逻辑可以通过存储库访问它。我想确定当我从逻辑调用 Write 方法时,存储库 Write 方法被调用一次。我的代码:

    [Test]
    public void TestThatWriteWasCalledOnce()
    {
        Mock<IRepository> mockinstance = new Mock<IRepository>();
        LogicSaveGame logic = new LogicSaveGame(mockinstance.Object);
        //mockinstance.Setup(x => x.Write(It.IsAny<string>(), It.IsAny<string>())).  //???
        logic.Write(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>());
        mockinstance.Verify(x => x.Write(It.IsAny<string>(), It.IsAny<string>()), Times.Once());
    }

当我运行上面的测试我得到错误:

Message: 
System.ArgumentNullException : Value cannot be null.
Parameter name: value
Stack Trace: 
XAttribute.ctor(XName name, Object value)

非常感谢您的帮助,找不到 google 的任何内容。

编辑,logicsavegame:

    private readonly IRepository saveGameRepo;

    public LogicSaveGame(IRepository repo)
    {
        this.saveGameRepo = repo;
    }

    public void Write(string name, string a, string b, string filename)
    {
        int ids = this.saveGameRepo.GetIds(filename);
        var xd = new XElement(
            "game",
            new XAttribute("id", ids + 1),
            new XAttribute("name", name),
            new XAttribute("hour", DateTime.Now.Hour),
            new XAttribute("minute", DateTime.Now.Minute),
            new XElement(
            "player1",
            new XElement("name", a.Name),
            new XElement(
            "player2",
            new XElement("name", b.Name),
            ));
        this.saveGameRepo.Write(filename, xd.ToString());
    }

编辑 2:我遇到了同样的错误 mockinstance.Setup(x => x.Write(It.IsAny(), It.IsAny())).Verifiable();

我闻到你在调用你的 LogicSaveGame 之前忘记正确设置你的模拟(这显然是保存到 XML 文件)。你可以参考这个link.

TL;DR

要解决您的问题,请传递给方法调用 logic.Write 具体 string 值,例如:

logic.Write("name", "a", "b", "filename");

说明

问题不在于模拟 IRepository。问题是你如何调用方法logic.Write。您使用 It.IsAny<string>() 将参数传递给它。方法 It.IsAny<string>() returns null 值,因此在执行期间您的方法 logic.Write 被调用,下一个值:

logic.Write(null, null, null, null);

内部方法 logic.Write 您创建 XAttribute("name", name)。文档说这个构造函数要求它的两个参数都不为空。在测试中,它使用 name 变量的 null 值调用,因此抛出指向构造函数 XAttribute.ctor(XName name, Object value) 的异常 System.ArgumentNullException : Value cannot be null。因此,要解决此问题,必须向方法 logic.Write 传递非空字符串值。