c#Moq objects void方法更改objects参数值

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

我试图在我的单元测试中使用mock,但我很难处理下面的代码。 我想以正确的方式从AppendName方法回调,以便正确地测试该方法,并实际更改模拟对象名称

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
是不同的类型。因此,默认情况下,我们无法使from
Mock
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";
    }
}