如何模拟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
传递非空字符串值。
我有一个 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
传递非空字符串值。