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 do owijania to, że powiedział, że wolą jawnie zadeklarować interfejs do rzeczy będę Mock jak ten – eglasius
@Freddy - I często korzystają z interfejsu, jak również. – tvanfosson