1

我面临一个我不太明白的问题。

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

这是我要模拟的课程:http: //pastebin.com/pMypAM7G

如果当前不存在,则此类返回一个新的 DataSourceContainer,否则返回现有的(需要它以避免具有多个上下文)

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

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

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

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

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

4

2 回答 2

1

您必须将 Databaseobject 注入到测试方法中。或者最好将其注入到 Userobjects 构造函数中,并可能使其不是静态的,因为它现在似乎是静态的。

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

于 2012-05-30T10:58:26.457 回答
1

您没有正确实现代码以支持单元测试 - 您正在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;
    }

您至少应该阅读有关Dependency Injection的内容。

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

    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()其值,但在测试时,模拟实现。

于 2012-05-30T11:00:15.697 回答