c#Moq objects void方法更改objects参数值
我试图在我的单元测试中使用mock,但我很难处理下面的代码。 我想以正确的方式从AppendName方法回调,以便正确地测试该方法,并实际更改模拟对象名称c#Moq objects void方法更改objects参数值,c#,mocking,moq,C#,Mocking,Moq,我试图在我的单元测试中使用mock,但我很难处理下面的代码。 我想以正确的方式从AppendName方法回调,以便正确地测试该方法,并实际更改模拟对象名称 public class GenericTests { [TestMethod] public void TestMethod1() { IFile newFile = GetNewFile("Document").Object; newFile.AppendName(); Asse
public class GenericTests
{
[TestMethod]
public void TestMethod1()
{
IFile newFile = GetNewFile("Document").Object;
newFile.AppendName();
Assert.AreEqual("AppendedDocument", newFile.Name);
}
public Mock<IFile> GetNewFile(string name)
{
Mock<IFile> file = new Mock<IFile>();
file.Setup(f => f.Name).Returns(name);
file.Setup(f => f.Path).Returns(@"C:\Folder\" + name);
file.Setup(f => f.AppendName()).Callback.....problem is here.....
return file;
}
}
public interface IFile
{
string Name { get; set; }
string Path { get; set; }
void AppendName();
}
public class LocalFile : IFile
{
public string Name { get; set; }
public string Path { get; set; }
public void AppendName()
{
this.Name = "AppendedDocument";
}
}
公共类泛型测试
{
[测试方法]
公共void TestMethod1()
{
IFile newFile=GetNewFile(“文档”).Object;
AppendName();
AreEqual(“AppendedDocument”,newFile.Name);
}
公共模拟GetNewFile(字符串名称)
{
Mock file=new Mock();
file.Setup(f=>f.Name).Returns(Name);
file.Setup(f=>f.Path)。返回(@“C:\Folder\”+名称);
file.Setup(f=>f.AppendName()).Callback…..问题就在这里。。。。。
返回文件;
}
}
公共接口文件
{
字符串名称{get;set;}
字符串路径{get;set;}
void AppendName();
}
公共类LocalFile:IFile
{
公共字符串名称{get;set;}
公共字符串路径{get;set;}
public-void-AppendName()
{
this.Name=“AppendedDocument”;
}
}
是否有人可以建议如何完成AppendName()的回调???请看,接口
IFile
和类LocalFile
是不同的类型。因此,默认情况下,我们无法使fromMock
从LocalFile
复制实现。要使测试正常工作,您可以添加下一个回调
调用:
public Mock<IFile> GetNewFile(string name)
{
Mock<IFile> file = new Mock<IFile>();
file.CallBase = true;
file.Setup(f => f.Name).Returns(name);
file.Setup(f => f.Path).Returns(@"C:\Folder\" + name);
file.Setup(f => f.AppendName()).Callback(() => file.Setup(f => f.Name).Returns(() =>
{
var localFile = new LocalFile();
localFile.AppendName();
return localFile.Name;
// or just return "AppendedDocument"
}));
return file;
}
我稍微改变了你的例子
GetNewFile
现在返回IFile
实例,并且LocalFile
的成员变为虚拟。希望有帮助。观察:您所展示的测试只是测试一个模拟对象,而不是实际测试您的代码,因此我希望您只是用它来演示问题,而不是作为真正的测试。Hi的可能重复,是的,这只是一个示例来说明我的问题:)
public class GenericTests
{
[Test]
public void TestMethod1()
{
IFile newFile = GetNewFile("Document");
newFile.AppendName();
Assert.AreEqual("AppendedDocument", newFile.Name);
}
public IFile GetNewFile(string name)
{
Mock<LocalFile> file = new Mock<LocalFile>();
file.CallBase = true;
file.Object.AppendName();
// remember expected result before setting up the mock
var appendDoc = file.Object.Name;
file.Setup(f => f.Name).Returns(name);
file.Setup(f => f.Path).Returns(@"C:\Folder\" + name);
file.Setup(f => f.AppendName())
// change property behavior after call of AppendName
.Callback(() => file.Setup(f => f.Name).Returns(appendDoc));
return file.Object;
}
}
public interface IFile
{
string Name { get; set; }
string Path { get; set; }
void AppendName();
}
public class LocalFile : IFile
{
public virtual string Name { get; set; }
public virtual string Path { get; set; }
public virtual void AppendName()
{
this.Name = "AppendedDocument";
}
}