6

我正在为我们的控制器编写一些单元测试。我们有以下简单的控制器。

public class ClientController : Controller
{

    [HttpPost]
    public ActionResult Create(Client client, [DataSourceRequest] DataSourceRequest request)
    {
        if (ModelState.IsValid)
        {
            clientRepo.InsertClient(client);
        }

        return Json(new[] {client}.ToDataSourceResult(request, ModelState));
    }
}

对此的单元测试如下:

[Test]
public void Create()
{
        // Arrange
        clientController.ModelState.Clear();

        // Act
        JsonResult json = clientController.Create(this.clientDto, this.dataSourceRequest) as JsonResult;

        // Assert
        Assert.IsNotNull(json);

}

控制器上下文是用以下代码伪造的:

 public class FakeControllerContext : ControllerContext
    {
        HttpContextBase context = new FakeHttpContext();

        public override HttpContextBase HttpContext
        {
            get
            {
                return context;
            }
            set
            {
                context = value;
            }
        }

    }

    public class FakeHttpContext : HttpContextBase
    {
        public HttpRequestBase request = new FakeHttpRequest();
        public HttpResponseBase response = new FakeHttpResponse();

        public override HttpRequestBase Request
        {
            get { return request; }
        }

        public override HttpResponseBase Response
        {
            get { return response; }
        }
    }

    public class FakeHttpRequest : HttpRequestBase
    {

    }

    public class FakeHttpResponse : HttpResponseBase
    {

    }


}

Create控制器操作尝试调用该ToDataSourceResult方法时会发生异常。

System.EntryPointNotFoundException : Entry point was not found.

调试显示 ModelState 内部字典在单元测试中为空(而不是在标准上下文中运行时)。如果ModelStateToDataSourceResult方法中删除,则测试成功通过。任何帮助深表感谢。

4

1 回答 1

5

JustDecompile中的一个快速峰值显示Kendo.Web.Mvc.dll是针对System.Web.Mvc 3.0 版构建的。您的测试项目可能引用了较新版本的 ASP.NET MVC (4.0),因此在运行时对System.Web.Mvc成员的任何调用都会导致 a System.EntryPointNotFoundException,因为无法解析这些成员。在您的特定情况下,对 KendoUI MVC 扩展方法ToDataSourceResult()的调用及其后续调用ModelState.IsValid是罪魁祸首。

这一切都在您的应用程序中正常工作的原因是,您的项目默认配置为 Visual Studio ASP.NET MVC 项目模板的一部分,以重定向程序集绑定,以便运行时以最新版本的 ASP.NET MVC 为目标组装。您可以通过在其 App.config 文件中添加相同的运行时绑定信息来修复您的测试项目:

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
                <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

我希望这会有所帮助。

于 2013-07-01T19:55:10.037 回答