当前位置: 首页 > 知识库问答 >
问题:

C#unit和moq-mock类的一个方法,也调用其他实基类方法

柏高洁
2023-03-14

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

新测试的Legacy类,尝试测试Split()方法。将Split方法中的using中的显式filestream创建重构为它自己的GetReaderStream方法,这样我就可以模拟它了(我一开始是受保护的,但我公开了它,以排除Moq保护的设置问题)。

public class MySplitter
{
  protected string _fileToSplit;
  protected string _outputFolder;

  public MySplitter(string fileToSplit, string outputFolder)
  {
    _fileToSplit = fileToSplit;
    _outputFolder = outputFolder;
  }
  
  public int Split()
  {
      int numberProcessed = 0;
      using (Stream streamToSplit = GetReaderStream())
      {
        // omit for brevity the logic we're trying to test
        numberProcessed++;
      }
      return numberProcessed;
  }
  
  public Stream GetReaderStream()
  {
    return new FileStream(_fileToSplit, FileMode.Open, FileAccess.Read);
  }
}

尝试模拟GetReaderStream函数,使单元测试使用来自ResourceStream的文本文件,而不是调用filesystem 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);
      }
    }

遗憾的是,我的Moq安装失败了,并且抛出了异常:Moq.dll中的“System.NotSupportedException”无法帮助我确定不支持我的安装的哪个方面。

共有1个答案

齐永昌
2023-03-14

rgvlee在评论中有权这样做,我会接受这个回答。因为这是我的第一个问题,我不确定,但它似乎我不能标记一个评论作为一个接受的答案。

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

 类似资料:
  • 实际上,它的测试如果eat方法对宠物有效,但我也需要检查feedPet方法对玩家也有效。 任何想法或建议都非常感谢。

  • 问题内容: 我正在做作业,遇到了一些错误。在一个类中,我有此方法: 现在,我收到错误消息“无法从静态上下文中引用非静态方法…”,因此我将getPoints()设置为静态方法,并将变量也设置为静态,并且它可以正常工作。但是在另一种打印对象的方法中,它不起作用(我相信是由于static关键字)。 所以我的问题是,有没有一种方法可以在不创建第二个Class实例的情况下调用方法?这是我所拥有的一般构想代码

  • 问题内容: 是否有一种方法可以使每次调用方法时都会被调用的“超级方法”,即使对于未定义的方法也是如此?有点像这样: 编辑- 细节:我有一个库,该库进行了很多更新,并且每次更新都变得晦涩难懂。为了简化我的工作流程,我正在使程序自动更新库(需要执行我想做的事情,我不会具体说明原因,但是我的程序可以与将来的更新一起使用)并且我有混淆映射与库一起下载时,我想制作一种例如称为的代理,然后在我调用它时,将获得

  • 问题内容: 如果我有两个类,而其中一个有一个要在其他类中使用的函数,那么该使用什么,这样就不必重写我的函数了? 问题答案: 有两种选择: 在您的类中实例化一个对象,然后在其上调用所需的方法 使用@classmethod将函数转换为类方法 例: 或使用继承(如果适用):

  • 问题内容: 在Python中,有没有一种方法可以从另一个类中调用一个类方法?我正在尝试在Python中旋转自己的MVC框架,但无法弄清楚如何从另一个类的一个类调用方法。 这是我想发生的事情: 我正在从PHP慢慢进入Python,因此我正在寻找与PHP等效的Python 。 问题答案: 更新:刚刚在您的帖子中看到了对它的引用。那不一样。用于获取函数对象,然后使用您的参数调用它 现在是一个实际的函数对