0

我有这个代码

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

我用最小起订量模拟这个:

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

这很好用。

现在我更改控制器代码:

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);

单元测试代码的第二个变体/编译错误:

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

如果您对验证逻辑不感兴趣,您可以匹配任何这样的输入(假设接收的委托类型FirstFunc<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 回答