2010-12-17 51 views
1

我已经建立了一个服务如下:如何使用起订量来模拟和测试IService

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. 起订量
  3. ASP.NET MVC

回答

4

为什么你会需要使用起订量?你不需要模拟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)); 
} 
+0

我想我不得不嘲笑仓库。 – 2010-12-17 18:02:50

+1

@Shawn Mclean - 你也可以将它存根。我认为我已经看到了比嘲笑的库更为残酷的库测试。 – jfar 2010-12-17 18:15:24

+0

我建议使用Assert.Throws而不是ExpectedException。 – TrueWill 2010-12-17 18:25:10

3

您测试具体的MyService。如果它需要依赖(比如在IRepository上),你可以创建一个该接口的模拟并将其注入到服务中。正如所写的,不需要模拟测试服务。

创建IMyService接口的意义在于测试依赖于MyService的其他类。一旦你知道知识库的工作原理,当你测试MyService(你模拟或者存储)时,你不需要测试它。一旦你知道MyService有效,当你测试MySomethingThatDependsOnMyService时,你不需要测试它。

+0

谢谢,这使得它更清晰。 – 2010-12-17 18:24:34