C# 如何模拟txt输出?
我有一个txt,逻辑可以通过存储库访问它。我想确定当我从逻辑调用Write方法时,repository的Write方法只被调用一次。我的代码:C# 如何模拟txt输出?,c#,moq,C#,Moq,我有一个txt,逻辑可以通过存储库访问它。我想确定当我从逻辑调用Write方法时,repository的Write方法只被调用一次。我的代码: [Test] public void TestThatWriteWasCalledOnce() { Mock<IRepository> mockinstance = new Mock<IRepository>(); LogicSaveGame logic = new Logi
[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());
}
我真的很感谢任何帮助,在谷歌上找不到任何东西
编辑,逻辑保存游戏:
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文件)之前忘记正确设置模拟。你可以参考这个。TL;DR
要解决问题,请转到方法调用逻辑。编写具体的字符串值,例如:
logic.Write("name", "a", "b", "filename");
解释
问题不在于模仿i假设
。问题是如何调用方法logic.Write
。您可以使用it.IsAny()
将参数传递给它。方法It.IsAny()
返回null
值,因此在执行过程中,将使用下一个值调用方法logic.Write
:
logic.Write(null, null, null, null);
在方法逻辑内部。编写您创建的。文档说明此构造函数要求其两个参数都不为null。在测试中,使用name
变量的null
值调用它,因此抛出一个异常System.ArgumentNullException:value不能为null
,该异常指向构造函数XAttribute.ctor(XName,Object value)
。因此,为了解决这个问题,有必要传递给方法logic.Write
非空字符串值。我认为我们缺少一些信息。你能展示一下logicsavegame类吗?我有很多类似问题的通用解决方案,甚至不考虑细节:我使用诊断流。它截取任何输出,然后我可以使用例如我的测试环境来分析内部流。诊断流是一个流
实现,它构建在代码给出的任何其他流之上。拦截I/O后,您可以执行任何操作,包括查看每个字节的读取或写入。这正是问题所在,我的写入方法无效,无法在设置中返回任何内容。非常感谢,它可以完美地处理大量字符串。Empty。
logic.Write(null, null, null, null);