Telerik.JustMock.Console.exe的旧版本版本为1.0.0.4,而R3 2022版本的版本为1.0.0.3。
在被测试的项目中引用nuget Microsoft.ApplicationInsights.AspNetCore V2.20.0会导致VS 2019代码覆盖率无法生成报告。以下是复制的步骤:
1.从模板ASP创建一个项目。针对。NET 5的。NET Core Web API
2.添加对nuget包microsoft . applicationsights . aspnetcore V2.20.0的引用
3.从c# JustMock测试项目中创建一个单元测试项目。. NET Core)模板。
4.运行VS代码覆盖。
预期结果:生成代码覆盖率报告。
实际结果:没有代码覆盖率报告
使用上面提到的(或以后的)产品版本,下面的简单测试失败(抛出NullReferenceException):
(TestMethod]公共无效TestMethod(){varcultureInfo = Mock.Create< cultureInfo >();varthisThrowsAnException = cultureInfo.Name;}
一种可能的解决方法是创建一个这样的模拟:
只读的字符串cultureName = CultureInfo.InvariantCulture.Name;...varcultureInfo = Mock.Create(() =>新CultureInfo (cultureName));
与本地安装的产品相比,使用不同版本的NuGet包可能会导致意想不到的错误,如下图所示:
该案例可在专用环境中重现(但可能不限于),包括Windows 10, JustMock R3.2021, Visual Studio 2019和。net 5。当分析器被启用时,Visual Studio会在测试发现方面出现问题,并报告“堆栈溢出”异常。这同样适用于使用Azure Function项目构建解决方案。
从测试执行时捕获的内存转储中的CLR堆栈:
000000CD7CE038D0 00007ffafb22d3b6 [GCFrame: 000000CD7CE038D0] 000000CD7CE03A40 00007ffafb22d3b6 [PrestubMethodFrame: 000000cd7ce0a40] 000000CD7CE0A530 00007ffafb22d3b6 [PrestubMethodFrame: 000000CD7CE0A530] System.Runtime.Loader.AssemblyLoadContext.OnAssemblyResolve(System.Reflection. System.Reflection.)RuntimeAssembly, System.String) 000000CD7CE0A988 00007ffafb22d3b6 [GCFrame: 000000CD7CE0A988] 000000CD7CE0E3C0 00007ffafb22d3b6 [PrestubMethodFrame: 000000CD7CE0E3C0] System.Runtime.Loader.AssemblyLoadContext.OnAssemblyResolve(System.Reflection. string)RuntimeAssembly, System.String)…(为简洁而省略)000000CD7CF72548 00007ffafb22d3b6 [GCFrame: 000000CD7CF72548] 000000CD7CF75F80 00007ffafb22d3b6 [PrestubMethodFrame: 000000CD7CF75F80] System.Runtime.Loader.AssemblyLoadContext.OnAssemblyResolve(System.Reflection. System.Reflection.)RuntimeAssembly, System.String) 000000CD7CF763D8 00007ffafb22d3b6 [GCFrame: 000000CD7CF763D8] 000000CD7CF79E10 00007ffafb22d3b6 [PrestubMethodFrame: 000000CD7CF79E10] System.Runtime.Loader.AssemblyLoadContext.OnAssemblyResolve(System.Reflection. System.Reflection.)RuntimeAssembly, System. string) 000000CD7CF7A268 00007ffafb22d3b6 [GCFrame: 000000CD7CF7A268] 000000CD7CF7DCA0 00007ffafb22d3b6 [PrestubMethodFrame: 000000CD7CF7DCA0] System. collections . general . dictionary ' 2[[System. collections . general . dictionary]__Canon, System.Private.CoreLib]、[系统。__Canon, System. private . corelib]]..ctor() 000000CD7CF7DF10 00007FFA9B787B2A System. appcontext .cctor() [/_/src/System. private . corelib /shared/System/AppContext.cs @ 16] 000000CD7CF7E340 00007ffafb2b6c93 [GCFrame: 000000CD7CF7E340] 000000CD7CF7ED18 00007ffafb2b6c93 [HelperMethodFrame: 000000CD7CF7ED18] 000000CD7CF7EE20 00007FFA9B7876B9 System. appcontext . cn]设置(Char**, Char**, Int32)
Mock.Create
mockexception:抽象类型“IPool”是无法访问为继承。在Telerik.JustMock.Core.MocksRepository。创建(类型类型,MockCreationSettings设置)在Telerik.JustMock.Mock.<>c__39 '1.b__39_0() In Telerik.JustMock.Core.ProfilerInterceptor.GuardInternal[T](Func ')1guardedAction)
创建模拟对象时
公共接口IPool{对象GetItem(在结构体,出b类);}
考虑以下简单的场景:
公共类Class1{私人字符串__arg1;公共Class1(字符串__arg1){这.arg1 = arg1;}公共类别3方法(字符串参数){扔新NotImplementedException ();}}公共类类别2{静态Class3 class3Instance;公共静态无效StaticMethod(字符串__arg1、字符串最长){Class1 class1Instance =新Class1 (__arg1);class3Instance = class1Instance.Method(arg2);}}公共类类别3{} [TestClass]公共类Class2Test{静态Class1 mockClass1 = Mock.Create();mockClass3 = Mock.Create();(TestInitialize]公共无效设置(){Mock.Arrange(() =>新Class1 (“__arg1”) .Returns (mockClass1);Mock.Arrange(() => mockClass1。方法(“最长”) .Returns (mockClass3);} (TestMethod]公共无效的(){Class2。StaticMethod (“__arg1”,“最长”);}}
测试通过了,但调试跟踪输出包含警告消息:从另一个测试方法调用一个测试方法可能会导致意外的行为,必须避免。从一个非测试方法中提取通用的模拟逻辑。”甚至没有调用其他测试方法。
我已经在JustMock的repo中创建了一个问题,你可以在这里找到它:https://github.com/telerik/JustMockLite/issues/162。以下是该问题的文本…
我目前正在进行一项PR,将JustMock添加到该存储库中现有的性能测试套件中。问题是,一些测试(如OneParameter和Callback)需要很长时间才能完成JustMock。我不确定为什么,但这使得JustMock无法添加到测试套件中。更重要的是,PR不能被接受,因为它需要很长时间才能完成。
Steve (repo的所有者)和我谈到的一件事是,如果传递给SimpleJobAttribute的invocationCount值(存在于MockingBenchmark和MockingBenchmark
在基准测试中,我用JustMock设置东西的方式可能有些地方不正确。直到今天我才开始使用JustMock:)。如果我做对了什么,请告诉我。
以下测试不再工作,因为版本JustMock_2021_2_615_4,但与JustMock_2021_1_326_1和旧版本一起工作:
公共接口它{无效测试(字符串文本);} (TestMethod]公共无效MyTestMethod(){varmock = mock . create < test >();mock. arrange (() => mock。测试(”“.OccursNever) .IgnoreArguments () ();Mock.Arrange(() => mock.Test(Arg.Matches)字符串>(a => a ==“一个”))) .InOrder () .OccursOnce ();Mock.Arrange(() => mock.Test(Arg.Matches)字符串>(a => a ==“b”))) .InOrder () .OccursOnce ();模拟。测试(“一个”);模拟。测试(“b”);Mock.Assert(模拟);}
如果我移除OccorsNever线,它就能工作了。
如果我删除2 InOrder,它工作。
似乎有些事情发生了变化://www.aliitrade.com/support/whats-new/justmock/release-history/justmock-r2-sp1-2021
我提交了一个先前的ThreadLeak:
我想我找到了另一个:(VS版本16.10.31321.278)
telerik_justmock_debugwindow_service_client ! Telerik.JustMock.DebugWindow.Service.Client.ServiceHostMonitor.MonitorTimer_Elapsed
显然,MonitorTimer_Elapsed代码运行在一个线程池线程上,耗时超过1秒(可能是在等待锁?)
出现另一个计时器,并再次调用该方法。最终,ThreadPool耗尽线程,并以每秒1个线程的速度增长(1Mb /sec泄漏)。
在一个转储中使用了2Gig(同一个MonitorTimer_Elapsed堆栈帧上的1962个线程)
在同一个垃圾场里,有52堆这样的框架:
telerik_justmock_debugwindow_service_client ! Telerik.JustMock.DebugWindow.Service.Client.ConnectionSetupServiceClientBase [[System.__Canon, mscorlib]] .get_ServiceAvailable
(这个项目和我之前的报告是一样的)。
下面的测试失败:
(TestMethod]公共无效TestCallOrderWithInOrder(){/ /安排varmockClass1 = Mock.Create();varmockClass2 = Mock.Create();Mock.Arrange(() => mockClass1.Method1()) .InOrder();Mock.Arrange(() => mockClass2.Method1()) .InOrder() .Occurs()2);Mock.Arrange(() => mockClass1.Method2()) .InOrder();/ /行为mockClass1.Method1 ();mockClass2.Method1 ();mockClass2.Method1 ();// <——这个调用是不允许的//当前InOrder子句//抛出AssertFailedExceptionmockClass1.Method2 ();/ /维护Mock.Assert (mockClass1);Mock.Assert (mockClass2);}
使用带有长路径名的测试容器(超过260个字符)的提升模拟模式(启用了分析器)会导致以下命令:
dotnet测试
因错误而失败:
Testhost process exit with error:致命错误。系统。AccessViolationException:试图读写受保护的内存。这通常表明其他内存已损坏。在microsoft . visualstudio . testplatform . testthost . program . main (System.String[])。请查看诊断日志以获取更多信息。测试运行中止。