c# - 如何模拟成员(member)提供者

标签 c# asp.net-mvc unit-testing moq membership-provider

我如何模拟我的成员(member)提供者(我有自定义成员(member)提供者,但不知道如何模拟它并将成员(member)作为提供者提供,因为 Membership.Provider 只有 getter)并在我的单元中使用该模拟的自定义成员(member)提供者测试?

这是我的 Controller

public class MyController
 {   
        private IMyRepository myRepository;

        public MyController(IMyRepository myRepository) 
        {
            this.myRepository= myRepository;
        }    

       [HttpGet]
        public ActionResult Create()
        {
            var user = Membership.GetUser(); // <--- I want mock this method
            ViewBag.User = user;
            return View("Create");
        }
}

这是我的测试(使用最小起订量)

 [TestClass]
    public class MyControllerUnitTest
    {
        private MyController controller;

        public MyControllerUnitTest()
        {
            Mock<IMyRepository > myRepository = new Mock<IMyRepository>();
            var controller = new GroupController(myRepository.Object);
        }

        [TestMethod]
        public void TestMethod1()
        {
            var result = controller.Create() as ViewResult;
            Assert.AreEqual("Create", result.ViewName);
        }
    }

最佳答案

@Sergey 是对的,你不应该直接使用 Membership 类。我知道在某些情况下您需要使用 Membership 类,因此添加以下信息。

您需要将 Membership 类包装在一个类(派生自接口(interface))中,然后您可以在任何需要的地方进行模拟。

我们得到的简短版本:

public interface IMembershipService
{
    MembershipUser GetUserDetails(string emailAddress);
    void CreateUserRole(string roleName);
    void AssignUserToRole(string username, string roleName);
    bool ValidateUserCredentials(string username, string password);
    void SetAuthenticationCookie(string username, bool rememberMe);
    void SignOut();
    void UpdateUser(MembershipUser membershipUser);
    bool DeleteUser(string username);
}

    public class MembershipService : IMembershipService
    {
        public MembershipUser GetUserDetails(string emailAddress)
        {
            return Membership.GetUser(emailAddress);
        }

        public MembershipUser GetUserDetails(Guid membershipId)
        {
            return Membership.GetUser(membershipId);
        }
   }

在你的 Controller 中注入(inject)它:

public class AdminController : Controller
{
    private readonly IMembershipService _membershipService;
    private readonly IEmailService _emailService;

    public AdminController(IMembershipService membershipService, 
        IEmailService emailService)
    {
        _membershipService = membershipService;
        _emailService = emailService;
    }
}

在单元测试中你可以做:

    var membershipService = new Mock<IMembershipService>();

关于c# - 如何模拟成员(member)提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28010282/

相关文章:

python - 测试用户邀请系统

c# 错误 1 ​​找不到类型或命名空间名称 ''(是否缺少 using 指令或程序集引用?)

具有 Postgres 数据库和适当大小写的 C# POCO 类(不使用 Entity Framework )

c# - 在 C# 中有选择地触发事件

c# - 在 Azure 中生成并执行工作进程

c# - Controller 总是收到空参数

c# - 评估函数 'System.Diagnostics.TraceInternal.Listeners.get' 超时,需要以不安全的方式中止

asp.net-mvc - asp.net 核心应用程序。 500内部服务器错误

iphone - 在 Sen 框架中测试异步响应

c# - 我可以创建一个 SqlDataReader 并为其提供值,而不必从另一个对象返回 SqlDataReader 吗? SqlCommand.ExecuteReader()