获取Moq以调用尚未覆盖的基类方法

时间:2016-07-09 14:52:28

标签: .net unit-testing tdd moq

我在我的MVC应用程序中使用Asp.Net Identity,我有一个名为ApplicationSignInManager的类,如下所示:

public class ApplicationSignInManager : SignInManager<ApplicationUser, string>
{
    public ApplicationSignInManager(ApplicationUserManager userManager, 
        IAuthenticationManager authenticationManager)
        : base(userManager, authenticationManager)
    {
    }

    public override Task<ClaimsIdentity> CreateUserIdentityAsync(ApplicationUser user)
    {
        return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager);
    }

    public static ApplicationSignInManager Create(IdentityFactoryOptions<ApplicationSignInManager> options, 
        IOwinContext context)
    {
        return new ApplicationSignInManager(context.GetUserManager<ApplicationUserManager>(), 
            context.Authentication);
    }
}

现在,我想为控制器上的操作编写单元测试。我正在使用Moq 4.5.10的Microsoft Visual Studio单元测试框架。

该操作调用基类PasswordSignInAsync中声明为virtual的{​​{1}}方法,但未在子类SignInManager<ApplicationUser, string>中覆盖。

我也试过这个选项:

ApplicationSignInManager

但是var mockSignInManager = new Mock<ApplicationSignInManager>() { CallBase = true }; mockSignInManager.Setup( m => m.PasswordSignInAsync(string.Empty, string.Empty, true, true)); 没有出现在Intellisense中,并且编译器抱怨它无法在PasswordSignInAsync上找到该方法。

如何让它出现?

1 个答案:

答案 0 :(得分:0)

我在单元测试项目中安装了NuGet包 Microsoft.AspNet.Identity.Owin ,它开始获取基类中的所有方法,因为该基类位于 Microsoft中。 AspNet.Identity.Owin.dll 程序集。

简而言之,如果要在模拟对象中访问基类的方法,那么如果该基类位于与派生类分开的程序集中,则必须在测试项目中添加对基类程序集的引用