Mocking VirtualPathUtility

6 posts, 0 answers
  1. Heiko
    Heiko avatar
    20 posts
    Member since:
    Jan 2009

    Posted 25 Oct 2012 Link to this post

    Hi,
    I'm having trouble when mocking methods from VirtualPathUtility class, i.e.VirtualPathUtility.ToAbsolute(...)

    Here is a test sample :

        public class XTest
        {
            static XTest()
            {
                Mock.Replace(() => System.Web.VirtualPathUtility.ToAbsolute(Arg.AnyString)).In<XTest>(x => x.Test());
            }

            [Fact]
            public void Test()
            {
                Mock.SetupStatic(typeof(System.Web.VirtualPathUtility));
                Mock.Arrange(() => System.Web.VirtualPathUtility.ToAbsolute(Arg.AnyString)).Returns("absolute");

                string r = System.Web.VirtualPathUtility.ToAbsolute("test");

                Assert.Equal("absolute", r);
            }
        }

    I've also tried using Mock.Initialize, Mock.Replace is static constructor but didn't help.
    I'm always getting exception:

    System.IO.FileNotFoundException : Could not load file or assembly 'Telerik.CodeWeaver.Api, Version=1.0.0.0, Culture=neutral, PublicKeyToken=87210992829a189d' or one of its dependencies. The system cannot find the file specified.

    Any idea what am I doing wrong?

    Thanks

    Heiko
  2. Kaloyan
    Admin
    Kaloyan avatar
    872 posts

    Posted 29 Oct 2012 Link to this post

    Hi Heiko,

     Thank you for contacting Telerik support.

     In order to mock "VirtualPathUtility" class, you do not need to use Mock.Replace, as it is generally used for mocking MSCorlib members. You can read more about it here:
     - http://www.telerik.com/help/justmock/advanced-usage-mscorlib-mocking.html

     To mock this class, I simply dropped the XTest() method from your example and the rest behaved as expected. I added some more content to your test method just to show that it is working for other methods from the "VirtualPathUtility" class. Here is the example:
    [TestMethod]
    public void ShouldArrangeMethodsFromVirtualPathUtilityClass()
    {
        Mock.SetupStatic(typeof(System.Web.VirtualPathUtility), Behavior.CallOriginal, StaticConstructor.Mocked);
     
        string expected = "Telerik";
     
        // Arrange
        Mock.Arrange(() => System.Web.VirtualPathUtility.ToAbsolute(Arg.AnyString)).Returns(expected);
        Mock.Arrange(() => System.Web.VirtualPathUtility.IsAbsolute(Arg.AnyString)).Returns(true);
     
        // Act
        string actual = System.Web.VirtualPathUtility.ToAbsolute("test");
        bool actualBool = System.Web.VirtualPathUtility.IsAbsolute("test");
     
        // Assert
        Assert.AreEqual(expected, actual);
        Assert.IsTrue(actualBool);
    }

     If this does not solve your issue and the exception still remain, I would recommend you to update the JustMock references in your project.

     I hope this helps. If there is anything else, I can help you with, please do not hesitate to ask.

    Greetings,
    Kaloyan
    the Telerik team

    Explore the entire Telerik portfolio by downloading Telerik DevCraft Ultimate.

  3. DevCraft R3 2016 release webinar banner
  4. Heiko
    Heiko avatar
    20 posts
    Member since:
    Jan 2009

    Posted 29 Oct 2012 Link to this post

    Hi,
    I've tried the sample you provided and it fails with the same exception:

    Result Message:    System.IO.FileNotFoundException : Could not load file or assembly 'Telerik.CodeWeaver.Api, Version=1.0.0.0, Culture=neutral, PublicKeyToken=87210992829a189d' or one of its dependencies. The system cannot find the file specified.
    Result StackTrace:    
    at System.Web.VirtualPathUtility.ToAbsolute(String virtualPath)
       at ShouldArrangeMethodsFromVirtualPathUtilityClass()

    I'm running it under xUnit, could that be the reason? That's the only difference I can think of. And when I try to debug it, then it's successful, strange.

    Thanks

    Heiko
  5. Ricky
    Admin
    Ricky avatar
    467 posts

    Posted 01 Nov 2012 Link to this post

    Hi Heiko,

    I just wrote your test using XUnit and it is working as expected. I am also sending it to you so please let me know if that works at your end as well.

    Moreover, make sure that Telerik.JustMock.DLL and Telerik.CodeWeaver.Api.DLL is in same folder as it is loaded dynamically by JustMock DLL. Further I am using TestDriven.Net and you do not need Mock.Replace for mocking members from System.Web.DLL

    In addition, you generally don't need to do Mock.SetupStatic unless you’re doing strict mocking or want the type to behave like stub.

    Therefore, my final test method looks like:


    public class XTest
    {
        [Fact]
        public void Test()
        {
            Mock.Arrange(() => System.Web.VirtualPathUtility.ToAbsolute(Arg.AnyString)).Returns("absolute");
     
            string r = System.Web.VirtualPathUtility.ToAbsolute("test");
     
            Assert.Equal("absolute", r);
        }
    }


    Hope this helps.

    Kind Regards
    Mehfuz
    the Telerik team

    Explore the entire Telerik portfolio by downloading Telerik DevCraft Ultimate.

  6. Heiko
    Heiko avatar
    20 posts
    Member since:
    Jan 2009

    Posted 08 Nov 2012 Link to this post

    Hi,
    I've tried your solution. And I have the same issue when I use the VS 2012 build in test runner (vstest.executionengine.x86.exe).
    It's independent whether I use xunit or nunit, the result is the same.
    When I use different test runner, for example from JustCode, then it works.

    Heiko
  7. Ricky
    Admin
    Ricky avatar
    467 posts

    Posted 12 Nov 2012 Link to this post

    Hi Heiko,

    I just installed xUnit.net runner for VS 2012 and was able to run the test inside VS Unit Test Explorer while debugging it.



    I am using Visual Studio 2012 RTM and referenced JustMock from installation directory.

    However, I was able to get your exception in run mode. This is because the out directory does not contain Telerik.CodeWeaver.Api.DLL that is internally loaded by JustMock assembly. Changing the target framework to .net 3.5 from properties page solved the issue (which is strange). This behavior is not visible mocking with MSTest.

    We will keep investing the issue and keep you posted on anything that we find in that regard. In the meantime, please check the workaround or use other test runners like TestDriven.Net or JustCode which do not copy DLLs to a separate folder.

    Kind Regards
    Ricky
    the Telerik team

    Explore the entire Telerik portfolio by downloading Telerik DevCraft Ultimate.

Back to Top
DevCraft R3 2016 release webinar banner