如何使用静态方法(UnitOfWork case)moq静态类?

我有这些课程:

public static class UnitOfWorkSS { public static IUnitOfWork Begin() { return IoC.Resolve(); } } public class PostService { using (IUnitOfWork unitOfWork = UnitOfWorkSS.Begin()) { //don't forget to sanitize html content htmlContent = _htmlSanitizer.Sanitize(htmlContent); IPost post = _factory.CreatePost(byUser, title, htmlContent); _postRepository.Add(post); unitOfWork.Commit(); } } 

我如何模拟UnitOfWorkSSunitOfWork类?

看起来你在调用Begin()时唯一要做的就是返回你为该特定接口配置的类: IUnitOfWork

您确实需要确保对Begin()的调用返回IUnitOfWork的模拟实现

您可以通过以下两种方式之一:

选项一 – 重构UnitOfWorkSS以便您可以设置要返回的IUnitOfWork实例

 public static class UnitOfWorkSS { private static IUnitOfWork _unitOfWork; public static IUnitOfWork UnitOfWork { set { _unitOfWork = value; } private get{ _unitOfWork ?? (_unitOfWork = IoC.Resolve()); } } public static IUnitOfWork Begin() { return UnitOfWork; } } [TestMethod] public void DoStuff() { var mockUnitOfWork = new Mock(); UnitOfWorkSS.UnitOfWork = mockUnitOfWork.Object; //Do some setup and verify } 

选项二 – 只需在IoC Container中注册IUnitOfWork的模拟实例

 private Mock _mockUnitOfWork; [TestInitialize] public void Init() { _mockUnitOfWork = new Mock(); //Making a lot of assumptions about your IoC here... IoC.Register(_mockUnitOfWork.Object); } [TestMethod] public void DoStuff() { _mockUnitOfWork.Setup( ... ); //Do some verification } 

模拟IUnitOfWork并将其注册到容器中,以便可以解决它。

据我所知,你不能模拟静态类或方法。

我意识到这是一个非常古老的问题,但万一有人在这里结束……

最好的解决方案是像其他答案所说的设计变更。 但是,如果这不可能,您可以使用Microsoft Fakes(替换Moles),或者,如果您不依赖于Visual Studio,则可以使用名为Smocks的库来提供帮助。

https://github.com/vanderkleij/Smocks