Как moq статический класс с помощью статического метода (случай UnitOfWork)? - PullRequest
11 голосов
/ 26 ноября 2010

У меня есть эти классы:

public static class UnitOfWorkSS 
{
  public static IUnitOfWork Begin()
  {
    return IoC.Resolve<IUnitOfWork>();
  }
}

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

Как я могу издеваться над классами UnitOfWorkSS и unitOfWork?

Ответы [ 4 ]

9 голосов
/ 26 ноября 2010

Похоже, что единственное, что вы делаете с вызовом Begin (), возвращает настроенный вами класс для этого конкретного интерфейса: IUnitOfWork

Вам просто нужно убедиться, что ваш вызов Begin () возвращает ложную реализацию IUnitOfWork

Один из двух способов сделать это:

Option One - Refactor UnitOfWorkSS, так что вы можете установить экземпляр IUnitOfWork, который будет возвращен

public static class UnitOfWorkSS  
{
    private static IUnitOfWork _unitOfWork;
    public static IUnitOfWork UnitOfWork
    {
        set { _unitOfWork = value; }
        private get{ _unitOfWork ?? (_unitOfWork = IoC.Resolve<IUnitOfWork>()); }
    }

    public static IUnitOfWork Begin()  
    {  
        return UnitOfWork;
    }  
}  

[TestMethod]
public void DoStuff()
{
    var mockUnitOfWork = new Mock<IUnitOfWork>();
    UnitOfWorkSS.UnitOfWork = mockUnitOfWork.Object;

    //Do some setup and verify
}

Вариант второй - Просто зарегистрируйте фиктивный экземпляр IUnitOfWork в своем контейнере IoC

private Mock<IUnitOfWork> _mockUnitOfWork;

[TestInitialize]
public void Init()
{
    _mockUnitOfWork = new Mock<IUnitOfWork>();

    //Making a lot of assumptions about your IoC here...
    IoC.Register<IUnitOfWork>(_mockUnitOfWork.Object);
}

[TestMethod]
public void DoStuff()
{
    _mockUnitOfWork.Setup( ... );

    //Do some verification
}
2 голосов
/ 26 ноября 2010

Создайте макет IUnitOfWork и зарегистрируйте его в своем контейнере, чтобы его можно было разрешить.

1 голос
/ 26 ноября 2010

Насколько я знаю, вы не можете высмеивать статические классы или методы.

0 голосов
/ 20 ноября 2016

Я понимаю, что это очень старый вопрос, но в случае, если кто-то здесь окажется ...

Лучшее решение - это изменение дизайна, как говорят другие ответы. Однако, если это невозможно, вы можете использовать Microsoft Fakes (которая заменила Moles) или, если вы не хотите зависеть от Visual Studio, есть библиотека Smocks, которая может помочь.

https://github.com/vanderkleij/Smocks

...