2009-03-17 22 views

Odpowiedz

7

Klasy statyczne i metody są naprawdę trudne w testach jednostkowych (jest to jeden z powodów, dla których staram się ich unikać). W tym przypadku prawdopodobnie opracowałbym wrapper wokół klasy statycznej, zawierający tylko te metody, których używam. Wtedy używałbym swojej klasy opakowania w miejsce prawdziwej klasy. Klasa otworkowa zostałaby skonstruowana w taki sposób, aby łatwo było ją wyszydzić.

Przykład (rodzaj) przy użyciu RhinoMocks. Należy zauważyć, że wykorzystuje on wtrysk zależności, aby poddać badanej klasie kopię opakowania. Jeśli dostarczone opakowanie jest puste, tworzy je.

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(); 
} 
+1

+1 do owijania to, że powiedział, że wolą jawnie zadeklarować interfejs do rzeczy będę Mock jak ten – eglasius

+0

@Freddy - I często korzystają z interfejsu, jak również. – tvanfosson

15

Jesteśmy dobrze przeszłości VS 2008, ale dla każdego, kto jest ciągle zmagają się z tym problemem, znalazłem rozwiązanie na: http://forums.asp.net/t/995143.aspx?Mocking+HTTPContext+object.

Użyj następującego kodu w testowym init, aby przesłonić domyślne wartości AppDomain. (The VirutalPathUtility metody statyczne użyje nowych wartości.)

[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); 
} 
+4

Zauważyłem to na początku. Za każdym razem, gdy szukałem w tym temacie, ten post wciąż pojawiał się, więc pomyślałem, że będzie to miało znaczenie dla obecnych narzędzi. –

+0

Mamy prawo do dzielenia się wiedzą w stylu pytań i odpowiedzi tutaj. W szczególności możesz zadać osobne pytanie dotyczące narzędzi 2013 i podać powyższą odpowiedź jako odpowiedź. Zwykle nie polecam tego dla nowych użytkowników [so]. Nie jestem pewien, czy możesz to zrobić z przedstawicielem "1". W przeciwnym razie może to być odpowiednie. –

+2

+1: Sposób, w jaki pytanie jest zatytułowane, Google zawsze zwraca je jako najlepsze trafienie. Więc to dobry pomysł, aby improwizować odpowiedzi. Przykro mi, ale nie sądzę, abym mógł zgodzić się z argumentacją w dół. To nie jest akceptowana odpowiedź i to wystarcza. – Mrchief

3

Korzystanie Microsoft Fakes możemy fałszywy VirtualPathUtility ToAbsolute Method łatwo.

  1. Przeglądaj System.Web w Referencje> Prawy przycisk myszy> Dodaj podróbki Montaż.

Zastosowanie następujący kod

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); 

      } 
     } 

} 
+1

To nie jest odpowiedź na pytanie - pytanie dotyczy VS2008, który nie miał podróbek. –

Powiązane problemy