qin*_*126 3 asp.net-mvc nunit unit-testing asp.net-mvc-3
我的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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的单元测试,不确定如何执行和声明。请帮助我,如果您需要其他层的代码,请告诉我。我会把它们放在这里。我认为这应该足够了。
[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
}
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,最好在编写代码之前先编写测试。这将允许您设计更方便的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));
}
Run Code Online (Sandbox Code Playgroud)
请记住,创建新用户时不应提供用户ID。用户保存到存储库后,应分配ID。
| 归档时间: |
|
| 查看次数: |
2856 次 |
| 最近记录: |