2010-12-17 8 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

そして、なぜあなたはMOQを使用する必要があるでしょうか? IServiceをモックする必要はありません。

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)); 
} 
あなたのケースでは、あなたがこのようなあなたのテストを書くことができます:あなたはこのようなシナリオを持っていた場合

[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を模擬する必要があります

+0

私はリポジトリを模擬しなければならないと思います。 –

+1

@Shawn Mclean - あなたはそれをスタブすることもできます。私は模倣されたリポジトリテストよりも多くのスタブ付きレポジトリテストを見たと思います。 – jfar

+0

ExpectedExceptionの代わりにAssert.Throwsを使用することをお勧めします。 – TrueWill

3

具体的なMyServiceをテストします。依存関係(IRepositoryなど)がある場合は、そのインターフェースのモックを作成し、それをサービスに挿入します。書かれているように、サービスをテストするためのモックは必要ありません。

IMyServiceインターフェイスを作成するポイントは、MyServiceに依存する他のクラスを単独でテストすることです。リポジトリが動作していることがわかったら、MyServiceをテストしているときにそれをテストする必要はありません。 MyServiceが機能していることがわかったら、MySomethingThatDependsOnMyServiceをテストするときにMyServiceをテストする必要はありません。

+0

ありがとうございます、これはより明確になります。 –