gpt4 book ai didi

asp.net-mvc-4 - MVC4单元测试和windows认证

转载 作者:行者123 更新时间:2023-12-02 01:56:38 25 4
gpt4 key购买 nike

据我所知,当我从 TestMethod 创建 Controller 实例时,除非我的 mvc4 应用程序使用 Windows 身份验证(因此我的 Controller 尝试读取用户对象),否则用户对象将保持为空。所以我的测试失败了。我可以做些什么来让他们工作?

附加信息:这是我的测试:

[TestMethod]
public void Create()
{
var ctrl = new LanguageController();
var res = ctrl.Manage() as ViewResult;
Assert.IsNotNull(res);
Assert.AreEqual(res.ViewName, "Create");
}

我的 LanguageController 有一个基类:

public class LanguageController : MyController
{

它有一个构造函数,在其中我尝试通过外部权限管理器发现用户权限。

public class MyController : Controller
{
protected Rights rm;
public MyController()
{
this.rm = RightManager.Discover(User.Identity);
}

在此构造函数中,我看到用户为空。

最佳答案

好的,您的单元测试几乎没有问题,我会在解释为什么 User 为 null 时检查它们。

这仅仅是因为您没有提供 User (IPrincipal) 实例的 stub 版本。所以你需要找到一种方法将其注入(inject)到你的 Controller 中。重要的是你在 Controller 中外部化尽可能多的依赖关系,这样它就不会提供一个干净的 Controller 来使用,而且重要的是促进 testability .

我会做的是注入(inject)依赖项,如下所示。

您的 SUT(被测系统)

public class MyController : Controller
{
protected Rights rm;
public MyController(IPrincipal user, IRightManager rightManager)
{
this.rm = rightManager.Discover(user.Identity);
}
}

public class LanguageController : MyController
{
public LanguageController(IPrincipal user, IRightManager rightManager)
: base(user, rightManager)
{
}

public ActionResult Manage()
{
return View("Manage");
}
}

这使我能够注入(inject)假用户和假 Right Manager。

那么当您在运行时运行应用程序时,您将如何获得真正的用户 RightManager?

您可以 inject the dependencies to the Controller在 Controller 创建期间。

如果您不使用 dependency injection框架(理想情况下你应该这样做),你仍然可以以手动方式注入(inject)依赖项。例如,在 Controller 中创建属性并在 Controller 中注入(inject)真实实例,并在单元测试期间注入(inject)假实例等。我不会详细说明,因为我有点偏离 - 但你可以找到很多 SO关于这方面的问题/网络引用。

您的单元测试现在您有了注入(inject)依赖项的方法,您可以轻松地从单元测试中注入(inject)它们。您可以使用 Isolation framework (AKA 和 Mock 对象框架)或者您可以按照老派的方式注入(inject)它们——这是手写的 mocks/fakes/stubs。我建议使用隔离框架。创建手动假货,引入不必要的代码重复和维护问题。由于我不知道你喜欢哪个框架,我创建了一些手写的假货/模拟/ stub 。

public class FakeRightManager : IRightManager {
public Rights Discover(IIdentity identity) {
return new Rights();
}
}

public class MyFakeIdentity : IIdentity {
public string AuthenticationType {
get { throw new NotImplementedException(); }
}

public bool IsAuthenticated {
get { throw new NotImplementedException(); }
}

public string Name {
get { throw new NotImplementedException(); }
}
}

public class MyFakePrincipal : IPrincipal {
public IIdentity Identity {
get { return new MyFakeIdentity(); }
}

public bool IsInRole(string role) {
throw new NotImplementedException();
}
}

你的单元测试:

    [TestMethod]
public void ManageAction_Execute_ReturnsViewNameManager()
{
var fakeUser = new MyFakePrincipal();
var fakeRightManager = new FakeRightManager();
var ctrl = new LanguageController(fakeUser, fakeRightManager);

var res = ctrl.Manage() as ViewResult;

Assert.AreEqual<string>(res.ViewName, "Manage");
}

在您的测试中,您检查 Assert.IsNotNull(res);这不是必需的,因为如果 res 为空,您的第二个断言无论如何都会失败。

同时始终给出一个非常具有描述性的精确单元测试名称。反射(reflect)你到底在测试什么。提高了测试的可读性和可维护性。

关于asp.net-mvc-4 - MVC4单元测试和windows认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19635134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com