我的mvc3项目有服务层和存储库层。
我的服务层:
public class UserService : IUserService
{
private readonly IUserRepository _userRepository;
public UserService(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public ActionConfirmation<User> AddUser(User user)
{
User existUser = _userRepository.GetUserByEmail(user.Email, AccountType.Smoothie);
ActionConfirmation<User> confirmation;
if (existUser != null)
{
confirmation = new ActionConfirmation<User>()
{
WasSuccessful = false,
Message = "This Email already exists",
Value = null
};
}
else
{
int userId = _userRepository.Save(user);
user.Id = userId;
confirmation = new ActionConfirmation<User>()
{
WasSuccessful = true,
Message = "",
Value = user
};
}
return confirmation;
}
}
这是我的单元测试,不确定如何执行操作和断言。请帮我,如果你需要其他层的代码,请告诉我。我会把它们放在这里。我认为这就足够了。
[TestFixture]
public class UserServiceTests
{
private UserService _userService;
private List<User> _users;
private Mock<IUserRepository> _mockUserRepository;
[SetUp]
public void SetUp()
{
_mockUserRepository = new Mock<IUserRepository>();
_users = new List<User>
{
new User { Id = 1, Email = "test@hotmail.com", Password = "" },
new User { Id = 1, Email = "test2@hotmail.com", Password = "123456".Hash() },
new User { Id = 2, Email = "9422722@twitter.com", Password = "" },
new User { Id = 3, Email = "john.test@test.com", Password = "12345".Hash() }
};
}
[Test]
public void AddUser_adding_a_nonexist_user_should_return_success_confirmation()
{
// Arrange
_mockUserRepository.Setup(s => s.Save(It.IsAny<User>())).Callback((User user) => _users.Add(user));
var newUser = new User { Id = 4, Email = "newuser@test.com", Password = "1234567".Hash() };
_userService = new UserService(_mockUserRepository.Object);
// Act
// Assert
}
}
BTW最好在编写代码之前编写测试。这将允许您设计更方便的API,并且在编写测试时不受实现细节的限制。
回到你的案例。您使用的是模拟存储库,因此不需要调用Save
来用一些用户填充存储库。实际上,你根本不需要填写mock。您应该简单地返回测试场景所需的值。
[Test]
public void ShouldSuccesfulltyAddNonExistingUser()
{
// Arrrange
int userId = 5;
var user = new User { Email = "newuser@test.com", Password = "1234567".Hash() };
_mockUserRepository.Setup(r => r.GetUserByEmail(user.Email, AccountType.Smoothie)).Returns(null);
_mockUserRepository.Setup(r => r.Save(user)).Returns(userId);
_userService = new UserService(_mockUserRepository.Object);
// Act
ActionConfirmation<User> confirmation = _userService.AddUser(user);
// Assert
Assert.True(confirmation.WasSuccessful);
Assert.That(confirmation.Message, Is.EqualTo(""));
Assert.That(confirmation.Value, Is.EqualTo(user));
Assert.That(confirmation.Value.Id, Is.EqualTo(userId));
}
请记住,在创建新用户时,不应提供用户id。应在用户保存到存储库后分配Id。
首先,我将根据用户是否已经存在来测试返回的确认对象。您要验证的另一件事是,当用户不存在时,会调用_userRepository.Save
。
// Act
var result = _userService.AddUser(newUser);
// Assert
Assert.IsTrue( /* Insert some condition about the result */ );
Assert.IsTrue( /* Rinse, wash, repeat */ );