测试.NET Framework时,无法加载.NET Core xUnit测试项目中发现的类型'System.Web.HttpContextBase'错误。

时间:2019-09-26 17:36:21

标签: c# asp.net .net asp.net-core xunit

我们有一个新的XUnit测试.NET Core 2.x项目,该项目正在测试.NET Framework 4.6.1项目的解决方案。调用日志时...

Log.Info(string.Format("Services - Begin...\nURL: {0} {1}\nREQUEST: {2}",postRequest.RequestUri, postRequest.subURL, postRequest.Body.BodyString), this);

...我们正在收到Sitecore异常...

"The type initializer for 'Sitecore.DependencyInjection.DefaultSitecoreServicesConfigurator' threw an exception."

...有一个内部异常,这似乎是问题的症结所在。

{"Could not load type 'System.Web.HttpContextBase' from assembly 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.":"System.Web.HttpContextBase"}

查看它,看来我得到的唯一答案是System.Web.HttpContextBase位于.NET Core和.NET Framework之间的不同系统库中,但是我找不到太多信息或如何解决它。我不知道如何强制单元测试使用一个或另一个。

我目前无法将.NET Framework项目更改为.NET Core(我们正在实施这些测试,以便可以对其进行修复。最终,所有内容都将变成.NET Core,但现在我需要拥有此.NET Core测试项目,测试解决方案中的所有.NET Framework库和应用程序。如果我删除了那行日志代码(我们不想这样做),则测试实际上可以正常工作。我需要在xUnit中添加或更改什么? .NET Core单元测试可以通过这些使我们的代码失败的日志记录语句?

作为参考,这是我的示例测试和一些有关上下文的支持代码:

Hashtable servicesDelegatePaths = new Hashtable();

servicesDelegatePaths.Add("CheckChild", "web/do/CheckChildBelongsToParent/CheckChildBelongsToParent");

public void CheckChild_Success()
            {
                var restStatus = new RestStatus
                {
                    Status = new JsonResponseStatus
                    {
                        code = 200,
                        desc = "Record Matched",
                        key = ""
                    },
                    Data = "This is the reply data"
                };
                SetupRalAndHttpClient(JsonConvert.SerializeObject(restStatus));

                var response = ral.CheckChild("123456978", "Jim", "Smith", "1234", new DateTime(2010, 1, 1));

                Assert.NotNull(response.Result);
                Assert.NotNull(response.Result.Status);
                Assert.Equal(200, response.Result.Status.code);
                Assert.Equal("Record Matched", response.Result.Status.desc);
            }

    private void SetupRalAndHttpClient(string httpResponseMessageContentString)
            {
                var handlerMock = new Mock<HttpMessageHandler>(MockBehavior.Strict);
                handlerMock
                    .Protected()
                    .Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
                    .ReturnsAsync(new HttpResponseMessage()
                    {
                        StatusCode = HttpStatusCode.OK,
                        Content = new StringContent(httpResponseMessageContentString)
                    })
                    .Verifiable();
                var httpClient = new HttpClient(handlerMock.Object);
                ral = new RAL(domainURL, httpClient);
                ral.DelegatePaths = servicesDelegatePaths;
            }

1 个答案:

答案 0 :(得分:0)

研究之后,我可以在.net framework 4.6.x中创建一个XUnit项目。它相对简单,但是作为参考,这里是一个链接。我不敢相信我以前没有看到过。

https://www.infoworld.com/article/3168787/how-to-work-with-xunit-net-framework.html

有了这个,我可以解决所有库问题,并且能够运行单元测试。

请注意,您不能直接从VS 2017和2019的“新建项目”菜单中直接创建XUnit项目。必须先创建一个类库,然后再添加所需的XUnit nuget包。