如何使用 Moq 模拟和测试 IService

Sha*_*ean 2 c# nunit moq

我有一个服务设置如下:

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. */
      }
}
Run Code Online (Sandbox Code Playgroud)

测试文件

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

    [Test]
    public void Duplicate_Country_Can_Not_Be_Added()
    { }

}
Run Code Online (Sandbox Code Playgroud)

我如何测试AddCountry和最小化存储库或服务。我真的不知道在这里做什么或嘲笑什么。有人可以帮我吗?

我正在使用的框架:

  1. 单位
  2. 起订量
  3. ASP.NET MVC

m0s*_*0sa 5

为什么需要使用最小起订量?您不需要模拟 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"));
}
Run Code Online (Sandbox Code Playgroud)

如果您有这样的场景,则需要模拟 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);
     }
  }      
}
Run Code Online (Sandbox Code Playgroud)

和这样的测试:

[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));
}   
Run Code Online (Sandbox Code Playgroud)