Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何编写单元测试用例来访问工作单元?_C#_.net_Unit Testing_Unit Of Work - Fatal编程技术网

C# 如何编写单元测试用例来访问工作单元?

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;

我编写了单元测试用例来测试adduser方法。当我模拟unitofwork并将其传递给构造函数时。它显示的错误类似于无法实例化类的代理。无法找到无参数构造函数

我需要测试的代码的构造函数:

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);

    }