模拟属性(或获取者)

本文关键字:获取 属性 模拟 | 更新日期: 2023-09-27 18:35:39

我遇到了一个不太明白的问题。

我正在使用实体框架在 C#/ASP.net 中开发一个应用程序。我正在尝试对它进行一些单元测试,因此我需要模拟其中一个对象,但我似乎无法解决它。

这是我想模拟的类:http://pastebin.com/pMypAM7G

如果当前不存在任何内容,则此类返回一个新的数据源容器,否则返回现有容器(需要它以避免具有多个上下文)

这是界面(唯一目的是允许模拟 http://pastebin.com/LRYVdA9j):

这是我试图测试的功能: http://pastebin.com/naVsV3FX

这是测试功能: http://pastebin.com/dY4ERzSJ

当我尝试进行测试时,我在 getter 中的数据库类上出现错误,因为没有 HttpContext(这是合乎逻辑的)。我不明白的是,getter应该被嘲笑。

试图在互联网上查找它,但我无法弄清楚我做错了什么,所以如果有人可以帮助我解决这个问题,我将不胜感激。谢谢!

模拟属性(或获取者)

您尚未正确构建代码以支持单元测试 - 您正在方法中创建外部对象(Database)。此外,您没有使用IDatabase接口,而是Database的具体实现

    public static User Connexion(String login, String MotDePasse)
    {
        Database bdd = new Database(); // this is inline, concrete implementation, this cannot be mocked
        User us = bdd._Context.UserSet.FirstOrDefault(u => u.login == login);
        if (us == null)
            throw new Exception("Nom d'utilisateur erroné");
        if (us.password != MotDePasse)
            throw new Exception("Mot de passe erroné");
        else
            return us;
    }

您至少应该阅读有关依赖注入的信息。

这个简短的示例可以帮助您理解代码中的问题

    public static User Connexion(String login, String MotDePasse, IDatabase bdd)
    {
        User us = bdd._Context.UserSet.FirstOrDefault(u => u.login == login);
        if (us == null)
            throw new Exception("Nom d'utilisateur erroné");
        if (us.password != MotDePasse)
            throw new Exception("Mot de passe erroné");
        else
            return us;
    }

这一次,Connexion松散地绑定到IDatabase接口,而不是它的实现。在运行时,您将提供new Database()作为其值,但在测试时,模拟实现。

您必须将数据库对象注入到测试的方法中。或者最好将其注入 Userobjects 构造函数,也许使其不是静态的,因为它现在似乎是静态的。

使用

提供的解决方案,您不会使用模拟对象。您正在Connexion函数中创建一个具体对象。