我无法模拟接口包含带有' in '参数的方法。当运行以下代码片段时,结果是一个异常:
信息:
测试方法Example.UnitTests.UnitTest.TestMethod抛出异常:
Telerik.JustMock.Core.MockException:抽象类型Example.UnitTestsInParamExample'不能用于继承。
堆栈跟踪:
MocksRepository。创建(类型类型,MockCreationSettings设置)
< > c__38 ' 1。<创建> b__38_0 ()
ProfilerInterceptor。GuardInternal [T] (Func 1 guardedAction)
testmethod()第23行
名称空间的例子。单元测试{使用Microsoft.VisualStudio.TestTools.UnitTesting;使用Telerik.JustMock;公共接口ParamExample{无效喷火(int参数);}公共接口InParamExample{无效喷火(在int参数);} (TestClass]公共类UnitTest{(TestMethod]公共无效TestMethod(){varmockedParamExample = Mock.Create();varmockedInParamExample = Mock.Create();}}
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类);}
以下代码片段在调试时导致测试执行中的挂起:
模拟。SetupStatic (typeof(时间间隔),行为。CallOriginal StaticConstructor.NonMocked);Mock.Arrange(() => TimeSpan。FromSeconds (15) .Returns (TimeSpan.MinValue);
这个问题可以通过通过JustMock扩展菜单禁用DebugWindow来临时解决。
你好
我生成了一个语法树,我将使用Formatter.Format()从软件包Microsoft.CodeAnalysis.CSharp.Workspaces 4.4.0和。net 6中格式化它。在使用格式化器的地方存在一个测试,但是当启用JustMock分析器时,会抛出InvalidProgramException。当分析器被禁用时,一切工作正常。它在Windows和Linux上都失败。
信息:
系统。InvalidProgramException:公共语言运行库检测到无效程序。
堆栈跟踪:
ContextIntervalTree”2。男星(TIntrospector&内省)
FormattingContext。函数(AbstractFormatEngine引擎,TokenStream)
AbstractFormatEngine。CreateFormattingContext(TokenStream TokenStream, CancellationToken CancellationToken)
AbstractFormatEngine。格式(CancellationToken CancellationToken)
CSharpSyntaxFormatting。Format(SyntaxNode节点,SyntaxFormattingOptions选项,IEnumerable ' 1 formattingRules, SyntaxToken startToken, SyntaxToken endToken, CancellationToken CancellationToken)
AbstractSyntaxFormatting。GetFormattingResult(SyntaxNode节点,IEnumerable ' 1跨度,SyntaxFormattingOptions选项,IEnumerable ' 1规则,CancellationToken CancellationToken)
格式化程序。GetFormattingResult(SyntaxNode节点,IEnumerable ' 1跨度,Workspace工作空间,OptionSet选项,IEnumerable ' 1规则,CancellationToken)
格式化程序。格式(SyntaxNode节点,IEnumerable ' 1跨度,Workspace工作空间,OptionSet选项,IEnumerable ' 1规则,CancellationToken)
格式化程序。Format(SyntaxNode node, Workspace Workspace, OptionSet options, CancellationToken CancellationToken)
UnitTest1.Test1()第23行
你可以通过编写一个单元测试(我使用xUnit)来重现这一点:
[事实]公共无效Test1(){varclassText =@“使用系统;名称空间TestNameSpace。订单{公共类订单{公共Guid Id {get;设置;}}}”;varsyntaxTree = CSharpSyntaxTree.ParseText(classText);var工作区=新AdhocWorkspace ();varformattedClassText = Formatter.Format(syntaxTree.GetRoot(), workspace).ToFullString();var预期=@“使用系统;名称空间TestNameSpace。订单{公共类订单{公共Guid Id {get;设置;}}}”;断言。平等(预期,formattedClassText);}}
见附件。我们不使用免费版。
dotnet——信息
. net SDK:
版本:7.0.200
提交:534117727 b
运行环境:
操作系统名称:Windows
操作系统版本:10.0.19045
操作系统平台:Windows
消除:win10-x64
基本路径:C:\Program Files\dotnet\sdk\7.0.200\
主持人:
版本:7.0.3
架构:x64
提交:0 a2bda10e8
.NET sdk安装:
6.0.406 [C:\Program Files\dotnet\sdk]
7.0.200 [C:\Program Files\dotnet\sdk]
.NET运行时安装:
Microsoft.AspNetCore.App 6.0.14 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 7.0.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 6.0.14 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 7.0.3 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 6.0.14 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 7.0.3 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
发现的其他架构:
x86 [C:\Program Files (x86)\dotnet]
已注册于[HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]
环境变量:
没有设置
全球。json文件:
没有找到
了解更多:
https://aka.ms/dotnet/info
下载。net:
https://aka.ms/dotnet/download
使用带有长路径名的测试容器(超过260个字符)的提升模拟模式(启用了分析器)会导致以下命令:
dotnet测试
因错误而失败:
Testhost process exit with error:致命错误。系统。AccessViolationException:试图读写受保护的内存。这通常表明其他内存已损坏。在microsoft . visualstudio . testplatform . testthost . program . main (System.String[])。请查看诊断日志以获取更多信息。测试运行中止。
考虑以下简单的测试场景:
公共摘要类TestBase{公共静态TestContext TestContext {得到;集;}} [TestClass]公共类UnitTest1:TestBase{(ClassInitialize]公共静态无效ClassInitlialize(和TestContext ctx){TestContext = ctx;} (TestMethod]公共无效TestMethod1(){}} [TestClass]公共类UnitTest2:TestBase{(ClassInitialize]公共静态无效ClassInitlialize(和TestContext ctx){TestContext = ctx;} (TestMethod]公共无效TestMethod1(){}}
尝试在启用JustMock分析器的情况下运行上述测试,会出现System.InvalidProgramException异常。这个问题不能在MSTest中重现。TestFramework和MSTest。测试Adapter packages prior to 3.0.x.
下面的例子演示了这个问题:
[理论] [MemberData (nameof (GetMemberDataContext))]公共无效ValidParameters_Success(intparam1,intparam2){/ /安排模拟。SetupStatic (typeof(MyClass)的行为。严格,StaticConstructor.Mocked);Mock.Arrange(() => MyClass.method1()). return (真正的);/ /行为IService服务=新服务();保龄球Result = service.method2();/ /维护Assert.True(结果);Mock.Assert(() => MyClass.method1(), Occurs.Once());// <——此处测试失败,因为它报告方法调用发生了两次}
如果按照以下方式修改代码,则无法观察到问题,这表明行为不一致:
[理论] [MemberData (nameof (GetMemberDataContext))]公共无效ValidParameters_Success(intparam1,intparam2){/ /安排模拟。SetupStatic (typeof(MyClass)的行为。严格,StaticConstructor.Mocked);Mock.Arrange(() => MyClass.method1()). return (真正的) .OccursOnce ();/ /行为IService服务=新服务();保龄球Result = service.method2();/ /维护Assert.True(结果);Mock.Assert < MyClass > ();}
Telerik.JustMock.Console.exe的旧版本版本为1.0.0.4,而R3 2022版本的版本为1.0.0.3。
使用EntityFramework对一个简单类运行的单元测试永远不会完成,下面是代码:
公共类DbContext1:DbContext{公共DbContext1(字符串connectionString){}}
公共类程序{私人静态只读的SemaphoreSlim _lock =新SemaphoreSlim (1,1);公共异步任务运行(){等待_lock.WaitAsync ();试一试{等待InsertDbRow ();}最后{_lock.Release ();}}私人静态异步任务InsertDbRow(){等待RetryWrapperAsync (异步() => {使用DbContext1 dbContext =新DbContext1 (“con str”);等待dbContext.SaveChangesAsync ();});}公共静态异步任务RetryWrapperAsync(Func <任务>操作){为(int我=0;我<3.;我+ +){试一试{等待操作();打破;} catch(异常){等待的任务。延迟(One hundred.);}};}}
[TestClass]公共类ProgramTest{私人只读的DbContext1 mockContext1 = Mock.Create();[TestInitialize]公共无效设置(){Mock.Arrange(() =>新DbContext1 (“con str”) .Returns (mockContext1);} (TestMethod]公共异步任务TestMethod(){/ /安排程序程序=新项目();/ /行为等待program.Run ();// <——此时测试挂起}}
添加什么都不做的安排模拟上下文。SaveChanges修复挂起,但期望mock将在默认情况下处理这种情况,不需要显式安排。
在被测试的项目中引用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代码覆盖。
预期结果:生成代码覆盖率报告。
实际结果:没有代码覆盖率报告
如果您使用c# using声明并启用了JustMock高级(提升)模式,则运行时将抛出InvalidProgramException。
下面是演示该问题的示例代码:
公共类TestClass:IDisposable{公共无效处理(){}}
[TestClass]公共类夹具{公共接口它{} [TestMethod]公共异步任务测试(){ITest mock = mock . create ();使用TestClass test =新();}}
当在使用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.)运行timeAssembly, System.String) 000000CD7CF763D8 00007ffafb22d3b6 [GCFrame: 000000cd7cf763d8] 000000CD7CF79E10 00007ffafb22d3b6 [PrestubMethodFrame: 000000cd7cf79e10] System.Runtime.Loader.AssemblyLoadContext.OnAssemblyResolve(System.Reflection.RuntimeAssembly, System.String) 000000CD7CF7A268 00007ffafb22d3b6 [GCFrame: 000000cd7cf7a268] 000000CD7CF7DCA0 00007ffafb22d3b6 [PrestubMethodFrame: 000000cd7cf7dca0] System.Collections.Generic.Dictionary`2[[System.__Canon, System.Private.CoreLib],[System.__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.Setup(Char**, Char**, Int32)
考虑以下简单的场景:
公共类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”,“最长”);}}
测试通过了,但调试跟踪输出包含警告消息:从另一个测试方法调用一个测试方法可能会导致意外的行为,必须避免。从一个非测试方法中提取通用的模拟逻辑。”甚至没有调用其他测试方法。