C#Xunit和Moq-模拟类的一个方法,也调用其他实际基类方法

C#Xunit和Moq-模拟类的一个方法,也调用其他实际基类方法,c#,moq,xunit,C#,Moq,Xunit,我来自爪哇,在那里我可以很容易地与间谍和Mockito做这类事情。我意识到Moq不支持Spies,但是如果您设置了CallBase,那么在调用其他实际方法的同时只模拟类中的一个方法似乎是可行的 新测试的遗留类,正在尝试测试Split()方法。将显式filestream创建从内部的using in the Split方法重构为它自己的GetReaderStream方法,这样我就可以模拟它(我一开始是受保护的,但我将其公开,以排除Moq保护的安装问题) 试图模拟GetReaderStream函数,使

我来自爪哇,在那里我可以很容易地与间谍和Mockito做这类事情。我意识到Moq不支持Spies,但是如果您设置了CallBase,那么在调用其他实际方法的同时只模拟类中的一个方法似乎是可行的

新测试的遗留类,正在尝试测试Split()方法。将显式filestream创建从内部的using in the Split方法重构为它自己的GetReaderStream方法,这样我就可以模拟它(我一开始是受保护的,但我将其公开,以排除Moq保护的安装问题)

试图模拟GetReaderStream函数,使单元测试使用来自ResourceStream的文本文件,而不是调用文件系统FileStream

    [Fact]
    public void Split_Test()
    {
      var mockSplitter = new Mock<MySplitter>(It.IsAny<string>(), It.IsAny<string>());
      mockSplitter.CallBase = true;

      var assembly = Assembly.GetExecutingAssembly();
      string resource = "MyNameSpace.Tests.Resources.SPLITTABLE_TEST_FILE_07.DAT";
      using (Stream stream = assembly.GetManifestResourceStream(resource))
      {
        mockSplitter.Setup(m => m.GetReaderStream()).Returns(stream);
        int numberOfFiles = mockSplitter.Object.Split();
        Assert.Equal(7, numberOfFiles);
      }
    }
[事实]
公共无效分割测试()
{
var mockSplitter=newmock(It.IsAny(),It.IsAny());
mockSplitter.CallBase=true;
var assembly=assembly.getExecutionGassembly();
string resource=“MyNameSpace.Tests.Resources.SPLITTABLE\u TEST\u FILE\u 07.DAT”;
使用(Stream=assembly.GetManifestResourceStream(资源))
{
mockSplitter.Setup(m=>m.GetReaderStream()).Returns(stream);
int numberOfFiles=mockSplitter.Object.Split();
Assert.Equal(7,numberOfFiles);
}
}
遗憾的是,我的Moq设置失败了
引发异常:Moq.dll中的“System.NotSupportedException”无法帮助我确定安装程序的哪个方面不受支持

我已确认已从资源文件成功填充我的流,并且在设置行中将其指定为预期返回值时,该流不为null


任何指导、补救性最低起订量帮助或“你从这里到不了那里”的建议都将不胜感激。

rgvlee有权在评论中提及,我会接受这个答案。因为这是我的第一个SO问题,所以我不确定,但似乎我无法将评论标记为可接受的答案


另外,我相信java中的方法在默认情况下是虚拟的,这就是mockito这些年来一直很开心的原因。一旦我在C#中将
GetReaderStream()
标记为virtual,Moq工作得很好,我甚至可以将它改回protected而不是public,并在测试中调整设置语法。

在模拟实现时,您想要模拟的成员必须是可重写的(虚拟或抽象的),很高兴我能提供帮助。我并不担心这些问题,也许可以在您的答案中添加一些详细信息/代码片段,包括可覆盖的代码更改和受保护的设置,以帮助其他看到您答案的人,然后将其标记为已接受:拇指支持:
    [Fact]
    public void Split_Test()
    {
      var mockSplitter = new Mock<MySplitter>(It.IsAny<string>(), It.IsAny<string>());
      mockSplitter.CallBase = true;

      var assembly = Assembly.GetExecutingAssembly();
      string resource = "MyNameSpace.Tests.Resources.SPLITTABLE_TEST_FILE_07.DAT";
      using (Stream stream = assembly.GetManifestResourceStream(resource))
      {
        mockSplitter.Setup(m => m.GetReaderStream()).Returns(stream);
        int numberOfFiles = mockSplitter.Object.Split();
        Assert.Equal(7, numberOfFiles);
      }
    }