我的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
}
}
答案 0 :(得分:4)
BTW最好在编写代码之前编写测试。这将允许您设计更方便的API,并且在编写测试时您不会受到实现细节的限制。
回到你的案子。您正在使用模拟存储库,因此您无需调用Save
来填充某些用户的存储库。实际上你根本不需要填充模拟。您应该只返回测试场景所需的值。
[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。
答案 1 :(得分:0)
首先,我将根据用户是否已经存在来测试返回的确认对象。您要验证的另一件事是当用户不存在时调用_userRepository.Save
。
答案 2 :(得分:0)
// Act
var result = _userService.AddUser(newUser);
// Assert
Assert.IsTrue( /* Insert some condition about the result */ );
Assert.IsTrue( /* Rinse, wash, repeat */ );