Подтвердить что ты не робот

Как moq статический класс со статическим методом (случай UnitOfWork)?

У меня есть следующие классы:

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?

4b9b3361

Ответ 1

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

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

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

Вариант 1 - Рефакторинг 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

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

Ответ 3

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

Ответ 4

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

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

https://github.com/vanderkleij/Smocks