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

Mocked方法执行的是真实代码而不是mock,为什么?[关闭]

和选
2023-03-14

我使用.callbase()是为了从TsExporter类中执行.export()方法的mock后面的实际代码。

在另一边,.retrieveTranslations()也在执行真实的代码,而不是像“我告诉它这样做”那样返回模拟值。

代码如下:

[TestFixture]
public class TestClass
{
    private Mock<ITsExporter> _tsExporter;

    [SetUp]
    public void SetUp()
    {
        _tsExporter = new Mock<TsExporter>().As<ITsExporter>();

        //This is calling the real code which is good
        _tsExporter.Setup(x => x.Export(It.IsAny<TsFileModel>(), It.IsAny<string>()))
            .CallBase();
        //but this is calling the real code too, and I was expecting not to
        //call it and return the mock instead...
        _tsExporter.Setup(x => x.RetrieveTranslations(It.IsAny<DataTable>(),
                It.IsAny<string>(), It.IsAny<string>()))
            .Returns(new DataTable());
    }

    [Test]
    public void Test()
    {
        _tsExporter.Object.Export(new TsFileModel(), "");
    }
}

我错过了什么?

谢谢你!

共有1个答案

岑炯
2023-03-14

您不应该嘲弄您正在测试的类,而应该嘲弄该类的依赖关系,以更改它们产生的输出以及它们如何影响您正在运行的代码。单元测试应该只测试一个逻辑位的代码。

请看这篇关于如何模拟的简单教程:https://developerhandbook.com/unit-testing/writing-unit-tests-with-nunit-and-moq/

更新

我认为您不应该嘲弄DB连接,或者将访问DB内容的类抽象到存储库并嘲弄它。

另一个问题是您使用的是哪种数据库访问?艾夫?戴帕?有一些方法可以对这些方法进行嘲弄,也可以测试您的类如何处理来自这些方法的各种返回。

例如EF:

如何模拟代码优先策略创建的EntityFramework数据库?以及人们是如何使用实体框架6进行单元测试的,您应该麻烦吗?

更新

您认为这意味着调用真正的实现或基类实现是正确的。但是,它在您的情况下并不适用,除非您正在尝试编写集成测试。如果您正在编写单元测试,那么您应该独立于其他类的实际输出来测试单个工作单元。我认为什么是CallBase特性是另一个问题。根据我的理解,这意味着调用您继承的类来测试该功能,但是您仍然不应该通过嘲弄实现它的类来测试它,如果它是抽象类,您不应该通过嘲弄测试类来测试它,否则您测试的是一个不同的类。或者更改类,或者不测试它,或者重新修改原始类以调用该类并查看它的输出。最重要的是,据我所知,您正在调用基函数来模拟连接字符串或类似的东西,这对运行代码没有影响,或者至少不应该,因为您正在模拟输出,否则这已经是集成测试了。

关于它的一篇很好的文章是:http://www.codeNutz.com/unit-testing-mocking-base-class-methods-with-moq/

 类似资料:
  • 问题内容: 我知道python具有用于确定字符串大小的函数,但是我想知道为什么它不是字符串对象的方法。 更新资料 好吧,我意识到我是一个尴尬的错误。实际上是字符串对象的方法。在字符串对象上使用len函数在Python中看到面向对象的代码似乎很奇怪。此外,看到名字而不是len也很奇怪。 问题答案: 字符串确实有一个length方法: Python中的协议是在具有一定长度并使用内置函数的对象上实现此方

  • 问题内容: 我最近一直在尝试在计算机上安装php和apache。几个小时后,它们就安装了。我已经像大家一样修改了httpd.conf和php.ini文件。然后,我创建了一个简单的php脚本: 但是,当我尝试使用它运行时,只会显示源代码而不是执行代码。我正在使用apache2,php5和Windows Vista。我一直在互联网上搜索失败,并且几乎要把头撞在墙上。谁能救我脱离脑震荡? 编辑的行: P

  • 为了简单起见,我将column称为col。为什么矩阵是[行,列]而不是[列,行]?这给我带来了很多头痛和困惑。 我的思路是这样的:1.一个正则数组, 就像一个矩阵,有一行和多列。它的符号是这样的:啊,如果我们有另一个维度, 现在有行了。因此,让我们在'n',arr[n,rows]之后记下这些行,但现实告诉我们,情况并非如此。 对不起,如果我混淆了你,对不起我的无知。

  • 我和NGINX的关系很紧张,这让我很疯狂。我有Ubuntu 12.04。VirtualBox上有3个LTS。我按照以下说明安装了NGINX-MYSQL-PHP: 安装php5 fpm 然后我在/etc/nginx/sites available/default中设置: 本地主机和信息。php被正确执行。现在我想建立一个本地网站,并尝试做一些重定向。因此,我在/usr/share/nginx/www

  • 我最近一直试图在我的电脑上安装PHP和Apache。几个小时后,它们就安装好了。我已经像大家说的那样修改了httpd.conf和php.ini文件。然后我创建了一个简单的PHP脚本: 但是当我尝试使用它只是显示源代码,而不是执行源代码。我正在使用Apache2、PHP5和WindowsVista。 编辑行: PHP。INI: HTTPD。形态

  • 问题内容: 因此,我一直在编写一个简单的3D GUI应用程序,旨在让用户只需双击JAR文件即可使用。在将其放入JAR文件之前,它可以正常工作,并且在命令提示符下运行时(在jar文件的目录中键入“ java -jar Modeler.jar”),可以在JAR文件中使其完美运行。但是,当我双击它时,什么也没有发生。它运行完美,没有命令提示符下的错误。我从经验中知道,没有显示启动时的崩溃报告,因为控制台