Mocking Extention Method fails with"QTAgendt32 ahs stopped working"

6 posts, 0 answers
  1. Masoud
    Masoud avatar
    61 posts
    Member since:
    Aug 2011

    Posted 30 Apr 2013 Link to this post

    Hi,

    I am working on an MVC 4 project againt .net 4.5 on Visual Studio 2012.  JustMock works great until I try to mock an extention method.
    Here ist what I did:
    - Installed JustMock from the msi file
    - In Visual StudioTelerik\JustMock doesn't offer the menu "Enable JustMock"/"Disable JustMock" but "Enable Profiler" and "Disable Profiler".  Enabled is chosen.  (http://www.telerik.com/help/justmock/advanced-usage.html)
    - Callling options I can select dot.cover (product from JetBrains)
    I mock an extention method as recommended in the documentation (http://www.telerik.com/help/justmock/advanced-usage-extension-methods-mocking.html)

    Mock.Arrange(() => projekte.WithPath(Arg.IsAny<IPrefetchPath2>())).Returns(projekte).MustBeCalled();

    WithPath is the extention method.

    The test fails
    - first I get a message box that says "vstest.executionengine.exe has stopped working"
    - i have to close the messagebox
    - in the test explorer the following message is given: 

    System.InvalidOperationException: There is no method 'WithPath' on type 'SupportClasses.QueryableExtensionMethods' that matches the specified arguments

    Thank you for your support on this issue!


  2. Kaloyan
    Admin
    Kaloyan avatar
    872 posts

    Posted 01 May 2013 Link to this post

    Hi Klaus,

    Thank you for the detailed message.

    In one of the latest JustMock official releases, we changed the Enable/Disable JustMock with the Enable/Disable Profiler option. However, it has the same functionality but a more suitable name, as it enables or disables the JustMock profiler. However, thank you for noticing that our documentation needs update. We have granted you some Telerik points for this.

    In JustMock Options, you will find a configuration window which will allow you to integrate JustMock with other 3rd party profiler using tools (like dotCover, as you have noticed). More about this could be found here.

    About the vstest.executionengine.exe error you are experiencing, it is a bug in JustMock which we have already fixed and this fix will be included in the next official release. A workaround I can suggest is to uncheck the "Keep test execution engine running between test runs" from Tools -> Options -> Web Performance Test Tools (I have attached a screenshot to guide you further).

    Finally, as such behavior of JustMock is not previously reported, is it possible to wrap the failing test method along with the SUT (System Under Test) into a compiling project and send it with your next message? Having it, I will be able to investigate it further and provide solution or at least a workaround until the issue is fixed.

    I hope this helps.

    Kind regards,
    Kaloyan
    the Telerik team
    Share what you think about JustTrace & JustMock with us, so we can become even better! You can use the built-in feedback tool inside JustTrace, our forums, or our JustTrace or JustMock portals.
  3. DevCraft R3 2016 release webinar banner
  4. Masoud
    Masoud avatar
    61 posts
    Member since:
    Aug 2011

    Posted 06 May 2013 Link to this post

    Hi Kaloyan,

    thank you for your reply.

    First here is the configuration I am using:
    - Windows Web Server 2008 R2, running in VMWare Workstation
    - Visual Studio 2012 Update 2
    - Resharper (latest version)
    - Dot.Cover (latest version)
    - JustMock (latest version, Profiler enabled, no external Profiler is linked)

    The project is an MVC 4 projekt in c# running against dot.net 4.5.
    Telerik.JustMock version is ereferenced by the test projekt.

    Here an example of the calls that are failing

    var queryable = new List<ProjektEntity> { projekt }.AsQueryable();
    Mock.Arrange(() => queryable.WithPath(Arg.IsAny<IPrefetchPath2>())).Returns(queryable).MustBeCalled();


    I changed the setting you described (unchecking "Keep test execution engine running between test runs") and I am no longer getting the error with QTAgendt32.  The error I am getting right now is the following:



    System.InvalidOperationException: There is no method 'WithPath' on type 'SD.LLBLGen.Pro.LinqSupportClasses.QueryableExtensionMethods' that matches the specified arguments
    Result StackTrace:
    at System.Linq.EnumerableRewriter.FindMethod(Type type, String name, ReadOnlyCollection`1 args, Type[] typeArgs, BindingFlags flags)
       at System.Linq.EnumerableRewriter.VisitMethodCall(MethodCallExpression m)
       at System.Linq.Expressions.OldExpressionVisitor.Visit(Expression exp)
       at System.Linq.Expressions.OldExpressionVisitor.VisitExpressionList(ReadOnlyCollection`1 original)
       at System.Linq.EnumerableRewriter.VisitMethodCall(MethodCallExpression m)
       at System.Linq.Expressions.OldExpressionVisitor.Visit(Expression exp)
       at System.Linq.EnumerableExecutor`1.Execute()
       at System.Linq.EnumerableQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
       at System.Linq.Queryable.Single[TSource](IQueryable`1 source, Expression`1 predicate)

    WithPath is the extention method I am attempting to mock.  
    The error appears to happen because the static method is not being mocked at all....
    The librariy containing the extention method is referenced and in the bin folder of the test application.
    I am getting the same error when I use the VS 2012 test runner and when using ReSharper's test runner.



    Thank you again for your help!

  5. Kaloyan
    Admin
    Kaloyan avatar
    872 posts

    Posted 07 May 2013 Link to this post

    Hi Klaus,

    In order to arrange the return of a collection, I would suggest the using of ReturnsCollection() instead of Returns(). I made a sample test, mocking an extension method and it works as expected:
    [TestMethod]
    public void TestMethod1()
    {
        // Arrange
        var queryable = new List<string> { "Telerik" }.AsQueryable();
        Mock.Arrange(() => queryable.WithPath<string>(Arg.AnyString)).ReturnsCollection(queryable).MustBeCalled();
         
        // Act
        var actual = queryable.WithPath<string>("asd"); // Acts by calling the WithPath method
     
        // Assert
        Assert.AreEqual(actual.First(), queryable.First()); // Asserts the collections are equal.
        Mock.Assert(queryable); // Asserts if WithPath has been called.
    }

    public static class MyExtensions
    {
        public static List<TSource> WithPath<TSource>(this IQueryable list, TSource item)
        {
            throw new NotImplementedException();
        }
    }

    I hope this helps. Please, contact us again if you need further assistance.

    Kind regards,
    Kaloyan
    the Telerik team
    Share what you think about JustTrace & JustMock with us, so we can become even better! You can use the built-in feedback tool inside JustTrace, our forums, or our JustTrace or JustMock portals.
  6. Masoud
    Masoud avatar
    61 posts
    Member since:
    Aug 2011

    Posted 07 May 2013 Link to this post

    Hi Kaloyan,

    thank you for your suggestion to use the ReturnCollection.

    I now am getting a stack overflow excpetion error running the test using the VS Test Runner.  Following is the Call Stack I was able to obtain:

      [Native to Managed Transition]
    > Microsoft.VisualStudio.QualityTools.Tips.UnitTest.Adapter.dll!Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.DefaultTestMethodInvoke(object[] args) + 0x43 bytes
      Microsoft.VisualStudio.QualityTools.Tips.UnitTest.Adapter.dll!Microsoft.VisualStudio.TestTools.TestTypes.Unit.DefaultTestMethodDecorator.Invoke(object[] args) + 0xb bytes
      Microsoft.VisualStudio.QualityTools.Tips.UnitTest.Adapter.dll!Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.RunTestMethod() + 0x14b bytes
      Microsoft.VisualStudio.QualityTools.Tips.UnitTest.Adapter.dll!Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.ExecuteTest() + 0xeb bytes
      Microsoft.VisualStudio.QualityTools.Tips.UnitTest.Adapter.dll!Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.Execute(Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestResult result) + 0x95 bytes
      Microsoft.VisualStudio.QualityTools.Tips.UnitTest.Adapter.dll!Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestRunner.ExecuteSingleTest(Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter executer, Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestResult result, Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement test, Microsoft.VisualStudio.TestTools.Execution.ITestContext testContext, Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestAdapterContext userContext, bool isLoadTest) + 0xe bytes
      Microsoft.VisualStudio.QualityTools.Tips.UnitTest.Adapter.dll!Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestRunner.ExecuteSingleTest(Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter executer, Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement test, Microsoft.VisualStudio.TestTools.Execution.ITestContext testContext, Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestAdapterContext userContext, bool isLoadTest) + 0x68 bytes
      Microsoft.VisualStudio.QualityTools.Tips.UnitTest.Adapter.dll!Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestRunner.Run(Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement test, Microsoft.VisualStudio.TestTools.Execution.ITestContext testContext, bool isLoadTest, bool useMultipleCpus) + 0x292 bytes
      [Appdomain Transition]
      Microsoft.VisualStudio.QualityTools.Tips.UnitTest.Adapter.dll!Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestAdapter.Run(Microsoft.VisualStudio.TestTools.Common.ITestElement testElement, Microsoft.VisualStudio.TestTools.Execution.ITestContext testContext, bool isLoadTest) + 0x37a bytes
      Microsoft.VisualStudio.QualityTools.Tips.UnitTest.Adapter.dll!Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestAdapter.Run(Microsoft.VisualStudio.TestTools.Common.ITestElement testElement, Microsoft.VisualStudio.TestTools.Execution.ITestContext testContext) + 0x2a bytes
     

    I managed however to make the tests run.  What I did was create two instances of IQueryable<>.  One was used to invoke the extention method, the other one was returned as result.  An example:
    var queryable0 = new List<ProjektEntity> { projekt0, projekt1, projekt2 }.AsQueryable();
    var queryable1 = new List<ProjektEntity> { projekt0, projekt1, projekt2 }.AsQueryable();
    Mock.Arrange(() => Db.GetProjekt()).Returns(queryable0).MustBeCalled();
    Mock.Arrange(() => queryable0.WithPath(Arg.IsAny<IPrefetchPath2>())).ReturnsCollection(queryable1).MustBeCalled();

    I have two instances queryable0 and queryable1.  This works!!!  Also, it works with ReturnsCollection and Returns.

    again, thank you for your effort and for a great product!


  7. Kaloyan
    Admin
    Kaloyan avatar
    872 posts

    Posted 08 May 2013 Link to this post

    Hi Klaus,

    I am glad the issue is solved now. Also, thank you for sharing your further efforts.

    Do not hesitate to contact us again if you need help.

    Regards,
    Kaloyan
    the Telerik team
    Share what you think about JustTrace & JustMock with us, so we can become even better! You can use the built-in feedback tool inside JustTrace, our forums, or our JustTrace or JustMock portals.
Back to Top
DevCraft R3 2016 release webinar banner