Статические классы и методы действительно сложны для работы в модульных тестах (это одна из причин, почему я стараюсь их избегать). В этом случае я бы, вероятно, разработал обертку вокруг статического класса, содержащую только те методы, которые я использую. Я бы тогда использовал свой класс-обертку вместо реального класса. Класс-обертка должен быть сконструирован так, чтобы его можно было легко удалить.
Пример (своего рода) использования 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();
}