ASP.NET MVC4 Mock单元测试,该如何解决
ASP.NET MVC4 Mock单元测试
第一次使用mock单元测试,但是总是抛出空引用的异常:请各位大牛们给看看啥问题:
接口文件:
public interface IUserRepository
{
IQueryable<User> Users { get; }
OperateResult SignIn(User user);
}
实现接口类的文件:
public class UserRepository : IUserRepository
{
public OperateResult SignIn(User user)
{
var result = new OperateResult
{
Success = Users.Any(u => u.UserName == user.UserName && u.Password == user.Password)
};
if (!result.Success)
{
result.Message = "错误的用户名或密码.";
}
return result;
}
public IQueryable<User> Users
{
get { throw new NotImplementedException(); }
}
}
测试方法类:
[TestClass]
public class UserTest
{
[TestMethod]
public void UserSingInTest()
{
var user1 = new User {UserId = 1, UserName = "jli@synvata.com", Password = "241925"};
var user2 = new User {UserId = 2, UserName = "junelee1211@qq.com", Password = "000000"};
var mock = new Mock<IUserRepository>();
mock.Setup(u => u.Users).Returns(new List<User>
{
user1,
user2
}.AsQueryable());
var result1 = mock.Object.SignIn(new User { UserId = 1, UserName = "jli@synvata.com", Password = "241925" });
var result2 = mock.Object.SignIn(new User { UserId = 2, UserName = "jli", Password = "241925" });
Assert.IsTrue(result1.Success);
Assert.IsFalse(result1.Success);
Assert.AreEqual(string.Empty, result1.Message);
Assert.AreEqual("错误的用户名或密码.", result2.Message);
}
}
运行测试总是会提示:
An exception of type 'System.NullReferenceException' occurred in DBPortal.Tests.dll but was not handled in user code
Additional information: 未将对象引用设置到对象的实例。
我猜猜原因可能就是UserRepository 类的Users引起的,可是想不明白的是我已经在测试类中给它添加虚假的值了啊。诸位给指点下是啥原因啊
------解决思路----------------------
扔掉mock,直接写测试不好么?
大不了你为 UserRepository 类先设计一个 AddUser 接口方法,然后在测试代码中把 user1、user2 插入一个对象实例,再两次调用它的 SignIn 方法就好了。
其实用不着 mock,直接写代码按照“真实程序”的代码写测试,效果足够好。
第一次使用mock单元测试,但是总是抛出空引用的异常:请各位大牛们给看看啥问题:
接口文件:
public interface IUserRepository
{
IQueryable<User> Users { get; }
OperateResult SignIn(User user);
}
实现接口类的文件:
public class UserRepository : IUserRepository
{
public OperateResult SignIn(User user)
{
var result = new OperateResult
{
Success = Users.Any(u => u.UserName == user.UserName && u.Password == user.Password)
};
if (!result.Success)
{
result.Message = "错误的用户名或密码.";
}
return result;
}
public IQueryable<User> Users
{
get { throw new NotImplementedException(); }
}
}
测试方法类:
[TestClass]
public class UserTest
{
[TestMethod]
public void UserSingInTest()
{
var user1 = new User {UserId = 1, UserName = "jli@synvata.com", Password = "241925"};
var user2 = new User {UserId = 2, UserName = "junelee1211@qq.com", Password = "000000"};
var mock = new Mock<IUserRepository>();
mock.Setup(u => u.Users).Returns(new List<User>
{
user1,
user2
}.AsQueryable());
var result1 = mock.Object.SignIn(new User { UserId = 1, UserName = "jli@synvata.com", Password = "241925" });
var result2 = mock.Object.SignIn(new User { UserId = 2, UserName = "jli", Password = "241925" });
Assert.IsTrue(result1.Success);
Assert.IsFalse(result1.Success);
Assert.AreEqual(string.Empty, result1.Message);
Assert.AreEqual("错误的用户名或密码.", result2.Message);
}
}
运行测试总是会提示:
An exception of type 'System.NullReferenceException' occurred in DBPortal.Tests.dll but was not handled in user code
Additional information: 未将对象引用设置到对象的实例。
我猜猜原因可能就是UserRepository 类的Users引起的,可是想不明白的是我已经在测试类中给它添加虚假的值了啊。诸位给指点下是啥原因啊
------解决思路----------------------
扔掉mock,直接写测试不好么?
大不了你为 UserRepository 类先设计一个 AddUser 接口方法,然后在测试代码中把 user1、user2 插入一个对象实例,再两次调用它的 SignIn 方法就好了。
其实用不着 mock,直接写代码按照“真实程序”的代码写测试,效果足够好。