总的来说,我对单元测试和 TDD 很陌生。
我在作为 Windows 服务托管的服务层 (WCF) 中有以下登录方法。我的服务层遵循外观模式,所有对服务层的调用都是用请求对象进行的,并返回相应的响应对象。
public LoginResponse Login(LoginRequest request)
{
var response = new LoginResponse(request.RequestId);
try
{
if (!ValidRequest(request, response, Validate.ClientTag))
return response;
var user = userDao.GetByUserId(request.UserId);
if (user != null)
{
if (request.Password != "")
{
var authenticationService = new AuthenticationService();
if (authenticationService.Authenticate(user, request.Password))
{
return response;
}
response.ErrorCode = "IncorrectPassword";
}
else
{
response.ErrorCode = "PasswordNotFound";
}
}
else
{
response.ErrorCode = "UserNotFound";
}
response.Acknowledge = AcknowledgeType.Failure;
return response;
}
catch (Exception ex)
{
Log.Error(ex);
response.Acknowledge = AcknowledgeType.Failure;
response.ErrorCode = "Exception";
return response;
}
}
这里的两行:
userDao.GetByUserId(request.UserId);
和
authenticationService.Authenticate(user, request.Password);
正在调用数据库。
这是我用 xUnit 和 JustMock 编写的测试:
[Theory]
[InlineData("manager", "manager")]
public void LoginTest(string userId, string password)
{
//Arrange
var userServiceMock = Mock.Create<IUserManagementService>();
var request = new LoginRequest().Prepare();
request.UserId = userId;
request.Password = password;
var response = new LoginResponse(request.RequestId);
Mock.Arrange(() => userServiceMock.Login(request)).Returns(response).OccursOnce();
//Act
userServiceMock.Login(request);
//Assert
Mock.Assert(userServiceMock);
}
我遇到的问题是即使在我将服务方法更改为
public LoginResponse Login(LoginRequest request)
{
return null;
}
我的测试仍然通过。我究竟做错了什么?