我们正在开发。net 5/核心服务,使用Rider IDE万博体育手机版网址和MacOS。
请:
1.添加支持在MacOS下运行JustMock(需要支持分析器,启用问题等),或者如果已经支持,请提供如何在每次测试中激活它的说明,例如使用NUnit。
2.添加与Rider的集成,这样所有的过程都会更容易。
考虑以下简单的测试场景:
公共摘要类TestBase{公共静态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()).Returns(真正的);/ /行为IService service =新服务();保龄球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()).Returns(真正的) .OccursOnce ();/ /行为IService service =新服务();保龄球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将默认处理这种情况,不需要显式地安排。
在测试的项目中引用Microsoft.ApplicationInsights.AspNetCore V2.20.0将导致VS 2019代码覆盖率无法生成报告。以下是复制的步骤:
1.从模板ASP创建一个项目。针对。NET 5的NET核心Web API
2.添加对核心包Microsoft.ApplicationInsights.AspNetCore V2.20.0的引用
3.从c# JustMock测试项目中创建一个单元测试项目。NET Core)模板。
4.运行VS代码覆盖。
预期结果:生成代码覆盖率报告。
实际结果:没有代码覆盖率报告
Mock.Create
mockexception:抽象类型“IPool”是无法访问为继承。在Telerik.JustMock.Core.MocksRepository。在Telerik.JustMock.Mock中创建(Type Type, MockCreationSettings settings)1.b__39_0() In Telerik.JustMock.Core.ProfilerInterceptor.GuardInternal[T](Func '1guardedAction)
创建模拟对象时
公共接口IPool{对象GetItem(在结构体,出b类);}
如果使用c# using声明并启用了JustMock高级(提升)模式,运行时将抛出InvalidProgramException。
下面是演示该问题的示例代码:
公共类TestClass:IDisposable{公共无效处理(){}}
[TestClass]公共类夹具{公共接口它{} [TestMethod]公共异步任务测试(){ITest mock = mock . create ();使用TestClass test =新();}}
UI应用程序的线程模型与测试主机不同,这可能会成为以下问题的根源:系统。调用线程必须是STA,因为许多UI组件都需要这个。.该请求是关于使用一些可以用来轻松解决此问题的帮助程序扩展JustMock。
当在使用JustMock的异步测试中添加断点时,调试器无法命中它。
要重现问题,请遵循以下步骤:
1.打开所附项目
2.在异步测试方法的第一个安排处创建断点。
3.开始调试异步测试
结果:没有命中断点。
. net Core和. net Framework都存在这个问题。
使用上述(或更高版本)产品版本,以下简单测试失败(抛出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 [GCFrame: 000000CD7CE03A40] 000000CD7CE0A530 00007ffafb22d3b6 [PrestubMethodFrame: 000000CD7CE0A530] System.Runtime.Loader.AssemblyLoadContext.OnAssemblyResolve(System.Reflection. reflection . b6)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. reflection . conf)运行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)