2015-04-21 3 views
0

У меня есть два класса, которые реализуют интерфейс, но оба класса имеют параметр, переданный в конструктор, чтобы определить, какой класс потребуется для приложения. Я пытаюсь проверить один метод (GetAvailablity) в классе (AvailablityRepoData), когда я создаю экземпляр AvailablityRepoData. Я получаю сообщение об ошибке для не виртуального метода. Я был бы очень признателен, если бы кто-то мог указать мне в правильном направлении.Тест модуля для двух классов наследует интерфейс

public interface IAvailablityRepo 
    { 
    string GetAvailablity(Availablity availablity); 
} 
public class AvailablityRepoData: IAvailablityRepo 
{ 

    public AvailablityRepoData(string websetting) { 
    } 
    public string GetAvailablity(Availablity availablity) { 
     return "Data"; 
    } 
} 

public class AvailablityRepoWeb:IAvailablityRepo 
{ 
    public AvailablityRepoWeb(string DataSetting) { 
    } 
    public string GetAvailablity(Availablity availablity) { 
     return "Web"; 
    } 
} 

public class Availablity 
{ 
    public virtual string Id { 
     get; 
     set; 
    } 
    public virtual string Status { 
     get; 
     set; 
    } 
} 

     var a = new Availablity() { Id = "111", Status = "A"}; 
     Mock<IAvailablityRepo> mockRepo = new Mock<IAvailablityRepo>(); 
     Mock<IAvailablityRepo> RepoData = new Mock<IAvailablityRepo>(); 
     RepoData.Setup(x => x.GetAvailablity(It.IsAny<Availablity> ())).Returns("pass"); 
     var result = RepoData.Object.GetAvailablity(a); 
+0

Пожалуйста, отформатируйте свой код. – Turing85

+0

Какая ошибка? Кроме того, это ошибка во время выполнения или ошибка времени компиляции? – Markus

+0

ошибка времени выполнения i dont хотите сделать Get GetAvailablity виртуальным методом на AvailablityRepoData – Kachou

ответ

1

Как уже было сказано в комментариях, из кода, который вы опубликовали, не ясно, какова ваша ошибка. Если я копирую и передаю его прямо в визуальную студию (обертывая тестовый код в тесте), тест проходит отлично. Я собираюсь предположить, что, когда вы испытали ошибку, проверить код на самом деле ближе к этому:

[TestMethod] 
public void TestMethod1() { 
    var a = new Availablity() { Id = "111", Status = "A" }; 
    Mock<IAvailablityRepo> mockRepo = new Mock<IAvailablityRepo>(); 
    Mock<AvailablityRepoData> RepoData = new Mock<AvailablityRepoData>(); 
    RepoData.Setup(x => x.GetAvailablity(It.IsAny<Availablity>())).Returns("pass"); 
    var result = RepoData.Object.GetAvailablity(a); 
} 

Это приводит к ошибке при выполнении теста:

System.NotSupportedException:Invalid setup on a non-virtual (overridable in VB) member: 
          x => x.GetAvailablity(It.IsAny<Availablity>()) 

Разница между этот тест и ваш оригинальный тест заключается в том, что я изменил тип Mocked с интерфейса IAvailabilityRepo на AvailabilityRepoData, который является конкретным классом. Поскольку Moq поддерживает только смешение интерфейсов/виртуальных методов, он, естественно, расстраивается.

Как уже упоминалось @prgmtc, ваш тест в его нынешнем виде практически не тестирует ничего.

С вашим текущим кодом на самом деле не похоже, что вам нужно использовать Mocks вообще. Нечто подобное могло бы быть более подходящим тест:

[TestMethod] 
public void TestDataRepoReturnsDataAvailability() { 
    var someImportantSetting = "thisShouldBeSomethingMeaningful"; 
    var availability = new Availablity() { Id = "111", Status = "A" }; 
    var sut = new AvailablityRepoData(someImportantSetting); 

    var returnedAvailability = sut.GetAvailablity(availability); 

    Assert.AreEqual("Data", returnedAvailability); 
} 

Предполагая, что ваш фактический код является более сложным, строка, переданная в свой репозиторий данных, предположительно, должны были бы быть гораздо более значимым ...

По общему правилу большого пальца, вы не должны насмехаться над тестируемой системой. Если вы обнаружите, что создаете макет для тестируемой системы, это хороший признак того, что у вас есть много функциональности в одном классе и/или вы пытаетесь проверить неправильную вещь ...

В качестве asside, вы можете захотеть взглянуть на что-то вроде builder pattern, чтобы создать свои разные репозитории, а не передавать тип в конструктор для каждого из репозиториев, как вы, кажется, предлагаете.

Смежные вопросы