C# 如何编写单元测试用例来访问工作单元?
我编写了单元测试用例来测试adduser方法。当我模拟unitofwork并将其传递给构造函数时。它显示的错误类似于无法实例化类的代理。无法找到无参数构造函数 我需要测试的代码的构造函数:C# 如何编写单元测试用例来访问工作单元?,c#,.net,unit-testing,unit-of-work,C#,.net,Unit Testing,Unit Of Work,我编写了单元测试用例来测试adduser方法。当我模拟unitofwork并将其传递给构造函数时。它显示的错误类似于无法实例化类的代理。无法找到无参数构造函数 我需要测试的代码的构造函数: public class UserManagement : IUserManagement { #region Property declarations private readonly IEntityBaseRepository<User> _userRepository;
public class UserManagement : IUserManagement
{
#region Property declarations
private readonly IEntityBaseRepository<User> _userRepository;
private readonly IEntityBaseRepository<Role> _roleRepository;
private readonly IEntityBaseRepository<UserStatus> _userStatusRepository;
private readonly IUnitOfWork _unitOfWork;
private readonly IEncryptionService _encryptionService;
private readonly IEntityBaseRepository<ForgotPassword> _forgotPassword;
#endregion
public UserManagement(
IEntityBaseRepository<User> userRepository,
IEntityBaseRepository<Role> roleRepository,
IEntityBaseRepository<UserStatus> userStatusRepository,
IUnitOfWork unitOfWork,
IEncryptionService encryptionService,
IEntityBaseRepository<ForgotPassword> forgotPassword)
{
this._userRepository = userRepository;
this._roleRepository = roleRepository;
this._userStatusRepository = userStatusRepository;
this._unitOfWork = unitOfWork;
this._encryptionService = encryptionService;
this._forgotPassword = forgotPassword;
}
公共类用户管理:IUserManagement
{
#区域属性声明
私有只读IEntityBaseRepository\u userRepository;
私有只读IEntityBaseRepository(角色存储库);
私有只读IEntityBaseRepository\u userStatusRepository;
私人只读i工作单元(unitof工作单元);;
专用只读电子选择服务(U encryptionService);;
私有只读IEntityBaseRepository_放弃密码;
#端区
公共用户管理(
IEntityBaseRepository用户存储库,
IENTITYBASE存储库角色还原,
IEntityBaseRepository userStatusRepository,
i工作单元工作单元,
EnciryOptionService加密服务,
IEntityBaseRepository forgotPassword)
{
这是。_userRepository=userRepository;
这个._roleRepository=roleRepository;
这。_userStatusRepository=userStatusRepository;
这个。_unitOfWork=unitOfWork;
这是._encryptionService=encryptionService;
这.\u forgotPassword=forgotPassword;
}
方法:
我已经通过构造函数传递了工作单元,但它仍然在_unitOfwork.commit()处中断
公共响应到AddUser(用户用户,字符串currentUserName)
{
var response=新的ResponseDTO()
试试看
{
User currentUser=this.\u userRepository.GetUserByUserName(currentUserName.Trim().ToLower());
如果(用户!=null)
{
如果(!this.\u userRepository
.FindBy(s=>s.Email.Trim().ToLower()==user.Email.ToLower().Trim()和&s.IsDeleted==false)
.Any())
{
如果(!this.\u userRepository.FindBy(
s=>!string.IsNullOrEmpty(user.MobileNumber)
&&s.MobileNumber==user.MobileNumber&&s.IsDeleted==false)。Any()
{
var newUser=newUser()
{
LastName=user.LastName,
FirstName=user.FirstName,
Username=user.Username,
Email=user.Email,
HashedPassword=user.HashedPassword,
Salt=user.Salt,
AreaCode=user.AreaCode,
MobileNumber=user.MobileNumber,
RoleId=user.RoleId,
地址=用户地址,
CreatedByUserId=currentUser.Id,
UserStatusId=(int)枚举。UserStatus.Active
};
此._userRepository.Add(newUser);
这是。_unitOfWork.Commit();
}
其他的
{
response.issucess=false;
response.UserMessage=“联系人号码已在使用中。”;
}
}
其他的
{
response.issucess=false;
response.UserMessage=“电子邮件已在使用中。”;
}
}
response.issucess=true;
response.UserMessage=user.Username+“用户创建成功”;
}
捕获(例外情况除外)
{
response.issucess=false;
response.TechMessage=ex.Message;
}
返回响应;
}
测试用例:
public void AddUser()
{
var userRep=new Mock();
var roleRep=new Mock();
var userStatusRep=new Mock();
var unitOfWork=new Mock();
var encryptRep=new Mock();
var forgetPasswordRep=new Mock();
var sut=新用户管理(userRep.Object、roleRep.Object、userStatusRep.Object、unitOfWork.Object、encryptRep.Object、forgetPasswordRep.Object);
User userDetail=新用户();
userDetail.FirstName=“jkkj”;
userDetail.LastName=“jjk”;
userDetail.Username=“sff”;
userDetail.Email=”grs@gmail.com";
userDetail.RoleId=1;
Assert.AreEqual(true,sut.AddUser(userDetail,“superadmin”).issucess);
}
为什么要在下面的行中传递null:
var unitOfWork=新模拟(空)
尽量不要在此处传递null,或者您可以在UnitOfWork类中定义一个无参数构造函数。Ok,但发布
AddUser
方法的整个代码,以查看如何模拟所有内容。您的响应的代码编辑并添加了AddUser方法“方法:在UnitOfWork.commit处中断”的完整代码-阅读并研究实际错误,说明您发现了什么以及为什么不起作用。请将您的单元测试(和模拟)代码添加到末尾public void AddUser()中标题为test Case的方法根据您的建议,删除了null并在工作单元类中添加了无参数构造函数。它显示了未设置为实例的对象引用。该类公共UnitOfWork(IDbFactory dbFactory){this.dbFactory=dbFactory;}公共unitofwork不是无参数构造函数。它正在接受参数。是的。我不知道在单元测试用例中模拟时如何将IDbfactory作为工作单元的参数传递,因为它是一个接口
try
{
User currentUser = this._userRepository.GetUserByUserName(currentUserName.Trim().ToLower());
if (user != null)
{
if (!this._userRepository
.FindBy(s => s.Email.Trim().ToLower() == user.Email.ToLower().Trim() && s.IsDeleted == false)
.Any())
{
if (!this._userRepository.FindBy(
s => !string.IsNullOrEmpty(user.MobileNumber)
&& s.MobileNumber == user.MobileNumber && s.IsDeleted == false).Any())
{
var newUser = new User()
{
LastName = user.LastName,
FirstName = user.FirstName,
Username = user.Username,
Email = user.Email,
HashedPassword = user.HashedPassword,
Salt = user.Salt,
AreaCode = user.AreaCode,
MobileNumber = user.MobileNumber,
RoleId = user.RoleId,
Address = user.Address,
CreatedByUserId = currentUser.Id,
UserStatusId = (int)Enumerations.UserStatus.Active
};
this._userRepository.Add(newUser);
this._unitOfWork.Commit();
}
else
{
response.IsSuccess = false;
response.UserMessage = "Contact number is already in use.";
}
}
else
{
response.IsSuccess = false;
response.UserMessage = "The email is already in use.";
}
}
response.IsSuccess = true;
response.UserMessage = user.Username + " user created successfully";
}
catch (Exception ex)
{
response.IsSuccess = false;
response.TechMessage = ex.Message;
}
return response;
}
Test case :
public void AddUser()
{
var userRep = new Mock<IEntityBaseRepository<User>>();
var roleRep = new Mock<IEntityBaseRepository<Role>>();
var userStatusRep = new Mock<IEntityBaseRepository<UserStatus>>();
var unitOfWork = new Mock<UnitOfWork>();
var encryptRep = new Mock<IEncryptionService>();
var forgetPasswordRep = new Mock<IEntityBaseRepository<ForgotPassword>>();
var sut = new UserManagement(userRep.Object, roleRep.Object, userStatusRep.Object, unitOfWork.Object, encryptRep.Object, forgetPasswordRep.Object);
User userDetail = new User();
userDetail.FirstName = "jkkj";
userDetail.LastName = "jjk";
userDetail.Username = "sff";
userDetail.Email = "grs@gmail.com";
userDetail.RoleId = 1;
Assert.AreEqual(true, sut.AddUser(userDetail, "superadmin").IsSuccess);
}