0

私はこのコードを持っています

public ViewResult Index(String u="", String p="")
{
var q = this.repository.First(x => x.UserName == "x" && x.Password == "y");

そして私はこれをMoqでモックします:

repository.Setup(method => method.First(
        x => x.UserName == "x" && x.Password == "y"
         )
    ).Returns(foo);

これはうまくいきます。

ここで、Controllercode を変更します。

public ViewResult Index(String u="", String p="")
{
var q = this.repository.First(x => x.UserName == u && x.Password == p);

しかし今、私はqでnullを取得するので、私のモッキングは機能しません. どうしたの?

ありがとう

4

2 に答える 2

0

これはテスト中のコードです:

public ViewResult Index(String u="", String p="")
{
var q = userRepository.First(x => x.UserName == u && x.Password == p);

if (q==null )
{
  //view login denied
}
else
{
    //view ok
}

単体テストコードの最初のバリアント/コンパイルエラーはありませんが、テスト時に常にnullを返します。

var userRepository = new Mock<IUserRepository>();
var user = new User {UserName = "x", Password = "y"};

String u="x";
String p = "y";

userRepository.Setup(method => method.First(
    x => x.UserName == u && x.Password == p
    )
).Returns(user);

ユニットテストコード/コンパイルエラーの2番目のバリアント:

var userRepository = new Mock<IUserRepository>();
var user = new User {UserName = "x", Password = "y"};


// I have broken the code on 2 lines, so that the problem can be seen.
Expression<Func<User, bool>> exp =  It.IsAny<Func<User, bool>>();  //here compile error

userRepository.Setup( r => r.First( exp ) ).Returns(user);  //no compile error
于 2012-11-30T06:30:52.930 に答える
0

まず、これらが平文のパスワードでないことを願っています。

あなたが得る理由q = nullはそれです

x => x.UserName == "x" && x.Password == "y"

と同じではありません

x => x.UserName == u && x.Password == p

ロジックの検証に関心がない場合は、次のような任意の入力を照合できます (が受け取ったデリゲート タイプが であると仮定しFirstますFunc<User, bool>)。

repository
   .Setup(r => r.First(It.IsAny<Func<User, bool>>()))
   .Returns(foo);

それ以外の場合は、コールバックを使用して述語がテスト ユーザーと一致するかどうかをテストできます。

var testUser = new User { userName = "", password = "" };

repository
   .Setup(r => r.First(It.IsAny<Func<User, bool>>()))
   .Callback<Func<User, bool>>(predicate => Assert.IsTrue(predicate(testUser)))
   .Returns(foo);

また、述語をコールバック内に格納し、後でテスト メソッドでアサートを実行することもできます。述語をより徹底的にテストしたい場合は、おそらくこれが適しています。

于 2012-11-28T16:38:13.543 に答える