简体   繁体   English

如何在Moq中设置此值以为我提供null或对象?

[英]How do I setup this in Moq to give me null or an object?

I want to saw that I do not care what is in the Find clause. 我想看到我不在乎Find子句中的内容。 Just give me null. 只是给我空。

Here is the test 这是测试

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

For the following controller and action 对于以下控制器和动作

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

EDIT 1: MY IUnitOfWork and implementation of the method 编辑1:我的IUnitOfWork和方法的实现

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

Declare the Method Find as virtual 将方法查找声明为虚拟

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

and the mock as: 和模拟为:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM