假货的原始答案(有关消除静电的处理,请参见下文)
所以有一个警告,我完全忘记了,直到我试图这样做。我敢肯定,Fakes仍然需要企业版的VS。我不知道是否有办法让它与Nunit一起工作,但当你无法更改代码时,有时你不得不处理它。
下面是一个给你的静态方法加上微光的例子。你还不需要担心httpcontext,因为你没有直接使用它。相反,你可以给你的
getText(string)
方法。
实际业务项目
namespace FakesExample
{
public class MyStaticClass
{
public static string GetText(string name)
{
throw new NullReferenceException();
}
}
}
你的单元测试项目
using System;
using Microsoft.QualityTools.Testing.Fakes;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace FakesExampleTests
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
using (ShimsContext.Create())
{
FakesExample.Fakes.ShimMyStaticClass.GetTextString = (s) =>
{
return "Go away null reference";
};
Console.WriteLine(FakesExample.MyStaticClass.GetText("foo"));
}
}
}
}
我真的运行了这个,所以我知道它是有效的。即使这样
GetText
调用时总是抛出一个nullreferenceexception,它的填充程序返回我们自己的自定义消息。
您可能必须生成一个visual studio测试项目。
在您的单元测试项目中,右键单击您的引用并说“add fakes”。它将为您的装配生成所有的垫片和短柱。
静电消除过程
最好的解决办法是努力消除静电。你已经找到了一个不使用它们的主要原因。
下面是如何删除静态和对httpcontext的依赖
public interface IResourceRepository
{
string Get(string name);
}
public class HttpContextResourceRepository : IResourceRepository
{
public string Get(string name)
{
return HttpContext.GetGlobalResourceObject("MyResources", name).ToString();
}
}
public class MyFormerStaticClass
{
IResourceRepository _resourceRepository;
public MyFormerStaticClass(IResourceRepository resourceRepository)
{
_resourceRepository = resourceRepository;
}
public string GetText(string name)
{
return _resourceRepository.Get(name);
}
}
然后,我将利用依赖注入来处理
HttpContextResourceRepository
和
MyStaticClass
(可能也应该是接口)在实际的业务代码中。
对于单元测试,我将模拟实现
[TestFixture]
public class UnitTest1
{
[Test]
public void TestMethod1()
{
var repoMock = new Mock<IResourceRepository>();
repoMock.Setup(repository => repository.Get("foo")).Returns("My Resource Value");
var formerStatic = new MyFormerStaticClass(repoMock.Object);
Console.WriteLine(formerStatic.GetText("foo"));
}
}
按照这条路线,您可以创建任意数量的iresourcerepository实现,并随时交换它们。