2014-05-05 30 views
1

我使用JustMock,我將具有與實體框架JustMock工作和嘲諷數據庫活動的困難 - 特別是假的插入JustMock與BLL

我想要做一個假的插入,然後返回假插入實體。我想在插入之前測試密碼是否被散列(由BLL處理)。

UserBLL

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 = "[email protected]", FirstName = "Peter", LastName = "Griffin" }); 
     fakeUsers.Add(new User { EmailAddress = "[email protected]", FirstName = "Lois", LastName = "Griffin" }); 

     //arrange 
     var context = Mock.Create<MyDatabaseEntities>(); 
     Mock.Arrange(() => context.Users).ReturnsCollection(fakeUsers); 

     //act 
     var bll = new UserBLL(context); 
     bll.Create("[email protected]", "password"); 

     //Assert 
     //handled by the expected exception 
    } 

失敗的測試

[Test] 
    public void Create_PasswordHashed() 
{  
    var context = Mock.Create<MyDatabaseEntities>();  

    //arrange 
    Mock.Arrange(() => context.SaveChanges()).MustBeCalled(); 

    var bll = new UserBLL(context); 
    bll.Create("[email protected]", "password"); 

    User user = bll.GetUser("[email protected]"); 

    //user is null? 
    Assert.IsTrue(user != null); //it fails here 
    Assert.IsTrue(user.Password != "password"); 
} 

我在做什麼錯?

回答

1

因此,我在網上查看一些樣本後發現了這一點。該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("[email protected]", "password"); 


     Assert.IsTrue(users.Count == 1); 
     Assert.IsTrue(!string.IsNullOrWhiteSpace(users[0].Password)); 
     Assert.IsTrue(users[0].Password != "password"); 
    }