如果您使用c# using声明并启用了JustMock高级(提升)模式,则运行时将抛出InvalidProgramException。
下面是演示该问题的示例代码:
公共类TestClass:IDisposable{公共无效处理(){}}
(TestClass]公共类夹具{公共接口它{} [TestMethod]公共异步任务测试(){ITest mock = mock . create ();使用TestClass test =新();}}
UI应用程序的线程模型与测试主机不同,这可能会导致以下问题:系统。InvalidOperationException: "调用线程必须是STA,因为许多UI组件需要这个".这个请求是关于用一些可以用来轻松解决这个问题的帮助器扩展JustMock。
当在使用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:)。如果我做对了什么,请告诉我。
考虑样例类
使用Azure.Messaging.ServiceBus;公共类类别2{私人静态ServiceBusSender messageToTopicSender;私人静态字符串topicName;公共静态无效SetRequestTopicClient(字符串serviceBusConnectionString,字符串topName){topicName = topName;ServiceBusClient =新ServiceBusClient (serviceBusConnectionString);messageToTopicSender = serviceBusClient.CreateSender(topicName);}}
下面的测试
(TestClass]公共类Class1Test{(TestInitialize]公共无效设置(){Mock.Arrange(() => Class2。SetRequestTopicClient (”“,”“) .DoNothing ();} (TestMethod]公共无效外种皮(){Class2。SetRequestTopicClient (”“,”“);}} [TestClass]公共类Class2Test{静态ServiceBusClient = Mock.Create();messageToTopicSender = Mock.Create();(TestInitialize]公共无效设置(){Mock.Arrange(() =>新ServiceBusClient (“若干”) .Returns (serviceBusClient);Mock.Arrange(() => serviceBusClient。CreateSender (“myTopic”) .Returns (messageToTopicSender);} (TestMethod]公共无效的(){Class2。SetRequestTopicClient (“若干”,“myTopic”);}}
按照TestA -> TestB的顺序执行测试会导致TestB失败,但更改顺序或单独运行测试会成功。测试的结果不应该依赖于执行顺序。