代码之家  ›  专栏  ›  技术社区  ›  punkouter

我如何在moq中设置它来给我一个空值或一个对象?

  •  2
  • punkouter  · 技术社区  · 7 年前

    我想知道我不在乎find子句中的内容。给我空的。

    这是测试

    [Fact]
    public void VerifyIndexViewType()
    {
        // Arrange
        var mockUserProvider = new Mock<IUserProvider>();
        mockUserProvider.Setup(x => x.GetUserId()).Returns("any-value-here");
        var mockUnitOfWork = new Mock<IUnitOfWork>();
        //how would I just return an object or null for example.. this doesnt work
       // mockUnitOfWork.Setup(x => x.UserProfileDataRepository.Find(u => u.ApplicationUserId == "any value here")).Returns((IRepository<UserProfileData>)null);
    
        var controller = new ProfileController(mockUnitOfWork.Object, mockUserProvider.Object);
    
        // Act
        var result = controller.Update();
    
        // Assert
        Assert.IsType<ViewResult>(result);
    }
    

    对于以下控制器和操作

    public class ProfileController : BaseController
    {
        private IUnitOfWork _unitOfWork;
        private readonly IUserProvider _requestUserProvider;
    
        public ProfileController(IUnitOfWork unitOfWork,
            IUserProvider requestUserProvider)
            : base(unitOfWork, requestUserProvider)
        {
            _unitOfWork = unitOfWork;
            _requestUserProvider = requestUserProvider;
        }
    
        public IActionResult Update()
        {
            //this is easy
            string userId = _requestUserProvider.GetUserId();
            //how do I do the setup in moq for this? 
            IEnumerable<UserProfileData> userProfileQuestions = _unitOfWork.UserProfileDataRepository.Find(x => x.ApplicationUserId == userId);
    
            if (userProfileQuestions != null)
            {
                ProfileViewModel profileViewModel = new ProfileViewModel();
                profileViewModel.UserProfileData = userProfileQuestions.FirstOrDefault();
                return View(profileViewModel);
            }
    
            return View("Error", "Home");
        }
    

    编辑1:我的工作和方法的实现

      public interface IUnitOfWork
    {
        IRepository<ApplicationUser> ApplicationUserRepository { get; }
        IRepository<RefMedicalSpecialty> RefMedicalSpecialtyRepository { get; }
        IRepository<RefProgramDetailData> RefProgramDetailDataRepository { get; }
        IRepository<RefProgramProfileData> ProgramProfileDataRepository { get; }
        IRepository<UserProgram> UserProgramRepository { get; }
        IRepository<UserFeedback> UserFeedbackRepository { get; }
        IRepository<UserAction> UserActionRepository { get; }
        IRepository<UserProfileData> UserProfileDataRepository { get; }
        IRepository<RawCredential> RawCredentialRepository { get; }
        IRepository<RefProgramCharacteristic> RefProgramCharacteristicRepository { get; }
        IRepository<UserProgramRefProgramCharacteristic> UserProgramRefProgramCharacteristicRepository { get; }
    
        void Commit();
        void RejectChanges();
        void Dispose();
    }
    
     public IRepository<UserProfileData> UserProfileDataRepository =>
          new Repository<UserProfileData>(_retContext);
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Mario Guadagnin    7 年前

    将find方法声明为virtual

     public virtual YourType Find(Expression<Func<YourClass, bool>> yourfunc)
    

    模型如下:

    mockUnitOfWork.Setup(x => x.UserProfileDataRepository.Find(It.IsAny<Expression<Func<YourClass, bool>>>()).Returns(DefineYourReturn);