模拟属性(或吸气剂)

时间:2012-05-30 10:50:37

标签: c# asp.net entity-framework nunit moq

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

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

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

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

这是界面(仅用于允许模拟):http://pastebin.com/LRYVdA9j

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

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

当我尝试进行测试时,我在getter中的Database类上收到错误,因为没有HttpContext(这是合乎逻辑的)。 我没有得到的是吸气剂应该被嘲笑。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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()作为其值,但在测试时,模拟实现。