2016-10-03 118 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

相关问题