Как заставить 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; } }
}

Так что теперь в ваших модульных тестах вы можете поменять местами разные варианты реализации вашего сервиса на расстоянии.

Другие вопросы по тегам