Asp.net mvc 需要帮助在mvc3项目中对我的服务层进行单元测试吗
我的mvc3项目有服务层和存储库层 我的服务层:Asp.net mvc 需要帮助在mvc3项目中对我的服务层进行单元测试吗,asp.net-mvc,asp.net-mvc-3,unit-testing,nunit,Asp.net Mvc,Asp.net Mvc 3,Unit Testing,Nunit,我的mvc3项目有服务层和存储库层 我的服务层: public class UserService : IUserService { private readonly IUserRepository _userRepository; public UserService(IUserRepository userRepository) { _userRepository = userRepository; } public ActionC
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;
}
}
public类用户服务:IUserService
{
专用只读IUserRepository\u userRepository;
公共用户服务(IUserRepository userRepository)
{
_userRepository=userRepository;
}
公共操作确认添加用户(用户)
{
用户existUser=\u userRepository.GetUserByEmail(User.Email,AccountType.Smoothie);
行动确认;
if(existUser!=null)
{
确认=新操作确认()
{
wasuccessful=false,
Message=“此电子邮件已存在”,
值=空
};
}
其他的
{
int userId=\u userRepository.Save(用户);
user.Id=userId;
确认=新操作确认()
{
WasSuccessful=正确,
Message=“”,
值=用户
};
}
返回确认;
}
}
这是我的单元测试,不确定如何执行act和assert。请帮助我,如果你需要其他层的代码,请告诉我。我会把它们放在这里。我认为这应该足够了
[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
}
}
[TestFixture]
公共类UserServiceTests
{
私人用户服务(UserService);;
私有列表用户;
私有Mock\u mockUserRepository;
[设置]
公共作废设置()
{
_mockUserRepository=new Mock();
_用户=新列表
{
新用户{Id=1,电子邮件=”test@hotmail.com“,密码=”},
新用户{Id=1,电子邮件=”test2@hotmail.com,Password=“123456”。Hash()},
新用户{Id=2,电子邮件=”9422722@twitter.com“,密码=”},
新用户{Id=3,Email=“john。test@test.com,Password=“12345”。Hash()}
};
}
[测试]
public void AddUser\添加\不存在\用户\应\返回\成功\确认()
{
//安排
_mockUserRepository.Setup(s=>s.Save(It.IsAny()).Callback((用户)=>\u users.Add(用户));
var newUser=新用户{Id=4,电子邮件=”newuser@test.com,Password=“1234567”。Hash()};
_userService=newuserservice(\u mockUserRepository.Object);
//表演
//断言
}
}
首先,我将根据用户是否已经存在来测试返回的确认对象。您要验证的另一件事是,当用户不存在时,会调用\u userRepository.Save
。顺便说一句,最好在编写代码之前编写测试。这将允许您设计更方便的API,并且在编写测试时不受实现细节的限制
// Act
var result = _userService.AddUser(newUser);
// Assert
Assert.IsTrue( /* Insert some condition about the result */ );
Assert.IsTrue( /* Rinse, wash, repeat */ );
回到你的案子上来。您使用的是模拟存储库,因此不需要调用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));
}
[测试]
public void应成功添加不存在的用户()
{
//阿兰奇
int userId=5;
var 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=newuserservice(\u mockUserRepository.Object);
//表演
ActionConfirmation=\u userService.AddUser(用户);
//断言
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。非常感谢,这就是我需要的。你能详细说明一下吗(顺便说一句,最好在编写代码之前先编写测试。)?代码您的意思是服务层中的实现应该在测试后编写?@feelexit完全正确。首先测试不存在的代码。因此,您应该关注代码应该做什么,而不是如何做。这种方法允许您创建简单易用的API。编写测试后,您可以通过添加所需的方法(例如,添加
UserService.AddUser
,IUserRepository.GetUserByEmail
,IUserRepository.Save
)的定义,使编译器满意。然后编写最简单的哑巴实现以通过测试,然后通过重构使代码闪闪发光。>>/*清洗、清洗、重复*/