1

よくわからない問題に直面しています。

Entity Frameworkを使用してC#/ASP.netでアプリケーションを開発しています。ユニットテストを実行しようとしているので、オブジェクトの1つをモックする必要があり、うまくいかないようです。

これが私がモックしたいクラスです:http: //pastebin.com/pMypAM7G

このクラスは、現在誰も存在しない場合は新しいDataSourceContainerを返し、それ以外の場合は既存のDataSourceContainerを返します(複数のコンテキストを持つことを避けるために必要です)

これがインターフェースです(これはモックを許可することだけを目的としています):http://pastebin.com/LRYVdA9j

これが私がテストしようとしている関数です:http://pastebin.com/naVsV3FX

そしてここにテスト機能があります:http://pastebin.com/dY4ERzSJ

テストを実行しようとすると、HttpContext(論理的)がないため、ゲッター内のDatabaseクラスでエラーが発生します。私が得られないのは、ゲッターが嘲笑されることになっているということです。

インターネットで調べてみましたが、何が悪いのかわからないので、誰か助けてくれたら本当にありがたいです。ありがとう !

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 に答える