Как использовать Moq для макетирования и тестирования IService - PullRequest
1 голос
/ 17 декабря 2010

У меня есть служба, настроенная следующим образом:

public interface IMyService
{
      void AddCountry(string countryName); 
}

public class MyService : IMyService
{
      public void AddCountry(string countryName)
      {
          /* Code here that access repository and checks if country exists or not.
             If exist, throw error or just execute. */
      }
}

Test.cs

[TestFixture]
public class MyServiceTest
{
    [Test]
    public void Country_Can_Be_Added()
    { }

    [Test]
    public void Duplicate_Country_Can_Not_Be_Added()
    { }

}

Как мне проверить AddCountry и moq репозитория или службы.Я действительно не уверен, что делать здесь или что издеваться.Может кто-нибудь мне помочь?

Используемые мной фреймворки:

  1. NUnit
  2. Moq
  3. ASP.NET MVC

Ответы [ 2 ]

4 голосов
/ 17 декабря 2010

А зачем вам использовать moq?Вам не нужно издеваться над IService.В вашем случае вы можете написать свой тест следующим образом:

[Test]
public void Country_Can_Be_Added()
{ 
  new MyService().AddCountry("xy");
}

[Test]
public void Duplicate_Country_Can_Not_Be_Added()
{ 
  Assert.Throws<ArgumentException>(() => new MyService().AddCountry("yx"));
}

Вам понадобится смоделировать IRepository, если у вас был такой сценарий:

interface IRepository { bool CanAdd(string country); }
class MyService : IService
{
  private IRepository _service; private List<string> _countries;
  public IEnumerable<string> Countries { get { return _countries; } }
  public X(IRepository service) { _service = service; _countries = new List<string>(); }
  void AddCountry(string x) 
  {  
     if(_service.CanAdd(x)) {
        _conntires.Add(x);
     }
  }      
}

И такой тест:

[Test]
public void Expect_AddCountryCall()
{ 
    var canTadd = "USA";
    var canAdd = "Canadd-a";

    // mock setup
    var mock = new Mock<IRepository>();
    mock.Setup(x => x.CanAdd(canTadd)).Returns(false);
    mock.Setup(x => x.CanAdd(canAdd)).Returns(true);

    var x = new X(mock.Object);

    // check state of x
    x.AddCountry(canTadd);
    Assert.AreEqual(0, x.Countires.Count);

    x.AddCountry(canAdd);
    Assert.AreEqual(0, x.Countires.Count);
    Assert.AreEqual(0, x.Countires.Count);
    Assert.AreEqual(canAdd, x.Countires.First());

    // check if the repository methods were called
    mock.Verify(x => x.CanAdd(canTadd));
    mock.Verify(x => x.CanAdd(canAdd));
}   
3 голосов
/ 17 декабря 2010

Вы тестируете конкретный MyService. Если это требует зависимости (скажем, от IRepository), вы создадите макет этого интерфейса и внедрите его в сервис. Как написано, для проверки сервиса не нужно издеваться.

Смысл создания интерфейса IMyService заключается в тестировании других классов, которые зависят от MyService в отдельности. Если вы знаете, что репозиторий работает, вам не нужно тестировать его, когда вы тестируете MyService (вы издеваетесь или заглушаете его). Если вы знаете, что MyService работает, вам не нужно тестировать его при тестировании MySomethingThatDependsOnMyService.

...