Как заставить UnitTests запускаться дважды с разными настройками макета
У меня есть проект, который поддерживает режим нескольких развертываний: InMem, OnPremise, Cloud. Также у каждого проекта есть небольшие сервисы, такие как TimeDistance, которые можно подключить либо к WCF, либо к API.
В unitTestMockup я могу сказать, какой из них я хочу использовать:
Service.TimeDistance = new WCFTimeDistance() / new APITimeDistance().
До сих пор у меня был только WCFTimeDistance, но сейчас мы находимся в переходном режиме, чтобы перейти к APITimeDistance, но в то же время я хочу, чтобы при запуске тестов он запускался дважды, один раз с WCF, один раз с API.
Какой хороший подход для этого?
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 ответ
Создайте два модульных теста. Также обратите внимание на использование абстракций вместо статических классов. Это сделало бы насмешку и тестирование легче.
Это для вашей текущей настройки
[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; } }
}
Так что теперь в ваших модульных тестах вы можете поменять местами разные варианты реализации вашего сервиса на расстоянии.