Unit testing 用BLL模拟
我使用的是JustMock,我很难让JustMock处理实体框架和模拟数据库活动,特别是一个假插入 我想做一个假插入,然后返回假插入的实体。我想测试密码在插入之前是否经过哈希处理(由BLL处理) UserBLLUnit testing 用BLL模拟,unit-testing,telerik,nunit,justmock,telerik-testing-tools,Unit Testing,Telerik,Nunit,Justmock,Telerik Testing Tools,我使用的是JustMock,我很难让JustMock处理实体框架和模拟数据库活动,特别是一个假插入 我想做一个假插入,然后返回假插入的实体。我想测试密码在插入之前是否经过哈希处理(由BLL处理) UserBLL public UserBLL(MyDatabaseEntities context) : base(context) { } public void Create(string email, string password) {
public UserBLL(MyDatabaseEntities context)
: base(context)
{
}
public void Create(string email, string password)
{
//check and make sure that the email does not already exist
User user = GetUser(email);
if (user != null)
throw new Exception("Email account already exists");
string salt = GetSalt();
var hashedPassword = HashPassword(password, salt);
var newUser = new User()
{
EmailAddress = email,
Password = hashedPassword
};
context.Users.Add(newUser);
context.SaveChanges();
}
这是我的测试
//This works
[Test]
[ExpectedException(ExpectedMessage = "Email account already exists")]
public void Create_NoDupeEmails()
{
List<User> fakeUsers = new List<User>();
fakeUsers.Add(new User { EmailAddress = "peter@email.com", FirstName = "Peter", LastName = "Griffin" });
fakeUsers.Add(new User { EmailAddress = "lois@email.com", FirstName = "Lois", LastName = "Griffin" });
//arrange
var context = Mock.Create<MyDatabaseEntities>();
Mock.Arrange(() => context.Users).ReturnsCollection(fakeUsers);
//act
var bll = new UserBLL(context);
bll.Create("peter@email.com", "password");
//Assert
//handled by the expected exception
}
//这很管用
[测试]
[ExpectedException(ExpectedMessage=“电子邮件帐户已存在”)]
public void Create_NoDupeEmails()
{
List fakeUsers=新列表();
添加(新用户{EmailAddress=”peter@email.com,FirstName=“彼得”,LastName=“格里芬”});
添加(新用户{EmailAddress=”lois@email.com,FirstName=“Lois”,LastName=“Griffin”});
//安排
var context=Mock.Create();
Mock.Arrange(()=>context.Users).ReturnsCollection(fakeUsers);
//表演
var bll=新的UserBLL(上下文);
创建(“peter@email.com“,”密码“);
//断言
//由预期的异常处理
}
失败测试
[Test]
public void Create_PasswordHashed()
{
var context = Mock.Create<MyDatabaseEntities>();
//arrange
Mock.Arrange(() => context.SaveChanges()).MustBeCalled();
var bll = new UserBLL(context);
bll.Create("test@email.com", "password");
User user = bll.GetUser("test@email.com");
//user is null?
Assert.IsTrue(user != null); //it fails here
Assert.IsTrue(user.Password != "password");
}
[测试]
public void Create_PasswordHashed()
{
var context=Mock.Create();
//安排
Mock.Arrange(()=>context.SaveChanges()).MustBeCalled();
var bll=新的UserBLL(上下文);
创建(“test@email.com“,”密码“);
User User=bll.GetUser(“test@email.com");
//用户是否为空?
Assert.IsTrue(user!=null);//此处失败
Assert.IsTrue(user.Password!=“Password”);
}
我做错了什么?所以我在网上查看了一些示例后发现了这一点。BLL保持不变,但这里是测试 曾经失败-现在通过测试
[Test]
public void Create_PasswordHashed()
{
//arrange
var context = Mock.Create<MyDatabaseEntities>();
var users = new List<User>();
Mock.Arrange(() => context.Users.Add(Arg.IsAny<User>()))
.DoInstead((User u) => users.Add(u)); //this will add the "user u" to the list of "users"
var bll = new UserBLL(context);
bll.Create("test@email.com", "password");
Assert.IsTrue(users.Count == 1);
Assert.IsTrue(!string.IsNullOrWhiteSpace(users[0].Password));
Assert.IsTrue(users[0].Password != "password");
}
[测试]
public void Create_PasswordHashed()
{
//安排
var context=Mock.Create();
var users=新列表();
Mock.Arrange(()=>context.Users.Add(Arg.IsAny()))
.DoInstead((User u)=>users.Add(u));//这将把“User u”添加到“users”列表中
var bll=新的UserBLL(上下文);
创建(“test@email.com“,”密码“);
Assert.IsTrue(users.Count==1);
Assert.IsTrue(!string.IsNullOrWhiteSpace(用户[0].Password));
Assert.IsTrue(用户[0]。密码!=“密码”);
}