2016-10-03 57 views
3

我有一個支持多種部署模式的項目:InMem,OnPremise,Cloud。 另外,每個項目都有像TimeDistance這樣的小型服務,它可以連接到WCF,也可以連接到API。如何使UnitTests以不同的樣機設置運行兩次

在unitTestMockup我可以說,這就是我想要的使用方法:

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

到現在爲止我只有WCFTimeDistance,但現在我們正處於過渡模式搬到APITimeDistance但在此期間,我想,當我運行測試來運行兩次,一次使用API​​的WCF。

這樣做的好方法是什麼?

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創建兩個單元測試。也看看使用抽象而不是靜態類。這將使嘲笑和測試更容易 – Nkosi

回答

3

創建兩個單元測試。也看看使用抽象而不是靜態類。它會使嘲笑和測試更容易。

這是您的當前設置

[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); 
} 

您的服務將使用抽象而不是結核。

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

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

因此,現在在您的單元測試中,您可以交換您的時間距離服務的不同實現。

+0

這正是如何抽象服務。我避免做重複測試,因爲我已經有〜110個UnitTests,並且會有太多重複的代碼。這就是我現在正在做的事情,我做了一個新的枚舉:WCF,API和我首先運行WCF的單元測試,然後運行API。 我認爲有一種方法可以自動完成所有這些工作 –

+1

@AndreiDutu然後查看像NUnit或xUnit這樣的單元測試框架,它們提供了這樣的功能,例如,請參閱:http://nunit.org/?p=testCase&r=2.5 – Mafii

相關問題