Код модульного тестирования, вызывающий VirtualPathUtility.ToAbsolute - PullRequest
13 голосов
/ 17 марта 2009

Я пытаюсь провести модульное тестирование некоторого кода, который вызывает VirtualPathUtility.ToAbsolute.

Возможно ли это с помощью инструментов модульного тестирования, поставляемых с VS 2008? Если нет, возможно ли это с более поздней версией Visual Studio?

Ответы [ 3 ]

18 голосов
/ 04 сентября 2014

Мы уже давно прошли VS 2008, но для тех, кто все еще сталкивается с этой проблемой, я нашел решение на:

Используйте следующий код в тестовом init для переопределения значений AppDomain по умолчанию. (Статические методы VirutalPathUtility будут использовать ваши новые значения.)

[TestInitialize]
public void Initialize()
{
    // Fake out env for VirtualPathUtility.ToAbsolute(..)
    string path = AppDomain.CurrentDomain.BaseDirectory; 
    const string virtualDir = "/";
    AppDomain.CurrentDomain.SetData(".appDomain", "*");
    AppDomain.CurrentDomain.SetData(".appPath", path);
    AppDomain.CurrentDomain.SetData(".appVPath", virtualDir);
    AppDomain.CurrentDomain.SetData(".hostingVirtualPath", virtualDir);
    AppDomain.CurrentDomain.SetData(".hostingInstallDir", HttpRuntime.AspInstallDirectory);
    TextWriter tw = new StringWriter();
    HttpWorkerRequest wr = new SimpleWorkerRequest("default.aspx", "", tw);
    HttpContext.Current = new HttpContext(wr);
}
8 голосов
/ 17 марта 2009

Статические классы и методы действительно сложны для работы в модульных тестах (это одна из причин, почему я стараюсь их избегать). В этом случае я бы, вероятно, разработал обертку вокруг статического класса, содержащую только те методы, которые я использую. Я бы тогда использовал свой класс-обертку вместо реального класса. Класс-обертка должен быть сконструирован так, чтобы его можно было легко удалить.

Пример (своего рода) использования RhinoMocks. Обратите внимание, что он использует внедрение зависимостей, чтобы дать тестируемому классу копию оболочки. Если предоставленная оболочка имеет значение null, она создает ее.

public class MyClass
{
     private VPU_Wrapper VPU { get; set; }

     public MyClass() : this(null) {}

     public MyClass( VPU_Wrapper vpu )
     {
         this.VPU = vpu ?? new VPU_Wrapper();
     }

     public string SomeMethod( string path )
     {
         return this.VPU.ToAbsolute( path );
     }
}

public class VPU_Wrapper
{
    public virtual string ToAbsolute( string path )
    {
         return VirtualPathUtility.ToAbsolute( path );
    }
}

[TestMethod]
public void SomeTest()
{
     string path = "~/path";
     string expected = "/app/path";

     var vpu = MockRepository.GenerateMock<VPU_Wrapper>();
     vpu.Expect( v => v.ToAbsolute( path) ).Return( expected );

     MyClass class = new MyClass( vpu );

     string actual = class.SomeMethod( path );

     Assert.AreEqual( expected, actual );

     vpu.VerifyAllExpectations();
}
3 голосов
/ 15 октября 2014

Используя Microsoft Fakes, мы можем легко подделать VirtualPathUtility ToAbsolute Method.

  1. Просмотр System.Web в списке литературы> Щелкните правой кнопкой мыши> Добавить сборку подделок.

Используйте следующий код

using Microsoft.QualityTools.Testing.Fakes;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Web.Fakes;

 public class TestCode
    {
        [TestMethod]
        public void TestSummaryTabLinks()
        {
            using (ShimsContext.Create())
            {
                //Fake VirtualPathUtility ToAbsolute method to Work properly in case of Unit Test Project
                //For Finding Relative url.
                ShimVirtualPathUtility.ToAbsoluteString = (string s) => { return s; };

                MyClass class = new MyClass( vpu );

                string actual = class.SomeMethod( path );

                Assert.AreEqual( expected, actual );

            }
      }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...