2016-10-03 3 views
3

私は複数の展開モードをサポートするプロジェクトを持っています:InMem、OnPremise、Cloud。 また、各プロジェクトにはTimeDistanceのような小さなサービスがあり、WCFにもAPIにも接続できます。私は私が使用したい1と言うことができunitTestMockupでUnitTestを異なるモックアップ設定で2回実行する方法

Service.TimeDistance = new WCFTimeDistance()/new APITimeDistance(). 

今まで、私はWCFTimeDistanceのみを持っていたが、今はAPITimeDistanceに移動する遷移モードであるが、その間に私は時にしたいです私は2度、WCFでAPIを使って1回実行するテストを実行します。

これを行うには、どのような方法が良いですか?

I use C# 4.5 
Microsoft.VisualStudio.QualityTools.UnitTestFramework as framework for unitTests 

所望のワークフローの簡単な例は、これを次のようになります。

1)Mockup: Service.TimeDistance = new WCFTimeDistance(); 
2)UnitTest: CheckDistanceBetweenTwoLocationsTest() 
{ 
Service.TimeDistance.CalculateDistance(Location1, Location2) // WCFTimeDistance 
} 
3)Mockup: Service.TimeDistance = new APITimeDistance(); 
UnitTest: CheckDistanceBetweenTwoLocationsTest() 
{ 
4)Service.TimeDistance.CalculateDistance(Location1, Location2) // APITimeDistance 
} 
+1

申し訳ありません - どの言語、どのようなユニットテストフレームワークですか?また、あなたは[mcve]を提供できますか?それでも、大きな質問です! – Mafii

+1

編集ありがとう! –

+0

@AndreiDutu 2つのユニットテストを作成します。また、静的クラスの代わりに抽象クラスを使用する方法もあります。それは嘲笑とテストをより簡単にするでしょう。 – Nkosi

答えて

3

は、2つのユニットテストを作成します。また、静的クラスの代わりに抽象クラスを使用する方法もあります。それは嘲笑とテストを容易にするでしょう。

これは、理想的には、抽象サービスにしたいと思うあなたの現在の設定のための

[TestClass] 
public class TimeDistanceTests { 
    //change these to the needed types 
    object Location1; 
    object Location2; 
    double expected; 

    [TestInitialize] 
    public void Init() { 
     //...setup the two locations and expectations 
     Location1 = //... 
     Location2 = //... 
     expected = //...the distance. 
    } 

    [TestMethod] 
    public void Check_Distance_Between_Two_Locations_Using_WCF() { 
     //Arrange 
     var sut = new WCFTimeDistance(); 
     //Act 
     var actual = sut.CalculateDistance(Location1, Location2); 
     //Assert 
     //...some assertion proving that test passes or failed 
     Assert.AreEqual(expected, actual); 
    } 

    [TestMethod] 
    public void Check_Distance_Between_Two_Locations_Using_API() { 
     //Arrange 
     var sut = new APITimeDistance(); 
     //Act 
     var actual = sut.CalculateDistance(Location1, Location2); 
     //Assert 
     //...some assertion proving that test passes or failed 
     Assert.AreEqual(expected, actual); 
    } 
} 

です。あなたのようなものを想定してください

public interface ITimeDistance { 
    double CalculateDistance(Location location1, Location location2); 
} 

あなたのサービスでは、concretionではなくabstractionが使用されます。

public class Service { 
    ITimeDistance timeDistance 
    public Service(ITimeDistance timeDistance) { 
     this.timeDistance = timeDistance; 
    } 

    public ITimeDistance TimeDistance { get { return timeDistance; } } 
} 

これで単体テストでは、あなたの時間距離サービスのさまざまな実装を入れ替えることができます。

+0

これはサービスが抽象化される方法です。すでに110個のユニットテストがあり、コードが重複しすぎるので、重複テストは避けてください。それで私は今、新しいenumを作っています:WCF、APIと私はまずWCFの単体テストを実行してAPIを実行します。 私はこのすべてを自動的に行う方法があると思った。 –

+1

@AndreiDutuはNUnitやxUnitのようなユニットテストフレームワークを調べる。ここをクリック:http://nunit.org/?p=testCase&r=2.5 – Mafii

関連する問題