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类);}
使用带有长路径名的测试容器(超过260个字符)的提升模拟模式(启用了分析器)会导致以下命令:
dotnet测试
因错误而失败:
Testhost process exit with error:致命错误。系统。AccessViolationException:试图读写受保护的内存。这通常表明其他内存已损坏。在microsoft . visualstudio . testplatform . testthost . program . main (System.String[])。请查看诊断日志以获取更多信息。测试运行中止。
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代码覆盖。
预期结果:生成代码覆盖率报告。
实际结果:没有代码覆盖率报告
当在使用JustMock的异步测试中添加断点时,调试器无法命中它。
按照以下步骤重现问题:
1.打开附带的项目
2.在异步测试方法的第一个安排处创建一个断点。
3.开始调试异步测试
结果:未命中断点。
这个问题在。net核心和。net框架中都可以观察到。
使用上面提到的(或以后的)产品版本,下面的简单测试失败(抛出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)
c# 8引入了默认接口方法实现。尝试在提升模式下使用JustMock模拟此类方法会失败。下面的例子说明了这个问题:
公共接口IMyInterface{intIntProperty {得到= >0;}} [TestClass]公共类UnitTest1{(TestMethod]公共无效TestMethod1(){varmock = mock . create ();Mock.Arrange(() => mock.IntProperty). return (1);断言。AreEqual (1, mock.IntProperty);}}
考虑以下简单的场景:
公共类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分析器时,它会在测试执行时提供性能冲击。这种效果是预期的,因为涉及到一个分析器。
我们能做的是找到一种更优化的方法来检测这些方法。
我已经在JustMock的repo中创建了一个问题,你可以在这里找到它:https://github.com/telerik/JustMockLite/issues/162。以下是该问题的文本…
我目前正在进行一项PR,将JustMock添加到该存储库中现有的性能测试套件中。问题是,一些测试(如OneParameter和Callback)需要很长时间才能完成JustMock。我不确定为什么,但这使得JustMock无法添加到测试套件中。更重要的是,PR不能被接受,因为它需要很长时间才能完成。
Steve (repo的所有者)和我谈到的一件事是,如果传递给SimpleJobAttribute的invocationCount值(存在于MockingBenchmark和MockingBenchmark
在基准测试中,我用JustMock设置东西的方式可能有些地方不正确。直到今天我才开始使用JustMock:)。如果我做对了什么,请告诉我。