2012-02-29 7 views
3

У меня возникли проблемы с издевательством в моих модульных тестах, поэтому я сделал простой пример, чтобы проиллюстрировать мою проблему. У меня есть следующий ...Нужна помощь с использованием Moq

public class SomeClass : ISomeInterface 
    { 
     public int ID { get; set; } 
     public string Desc { get; set; } 

     public int Create(SomeClass t) 
     { 
      return 5; 
     } 

     public int Create2(string s) 
     { 
      return 7; 
     } 
    } 

    public interface ISomeInterface 
    { 
     int Create(SomeClass t); 
     int Create2(string s); 
    } 

Теперь у меня есть два способа, чтобы проверить Передразнивал интерфейс

private void TestCreate() 
    { 
     var mocker = new Mock<ISomeInterface>(); 
     mocker.Setup(x => x.Create(new SomeClass())).Returns(3); 
     var result = mocker.Object.Create(new SomeClass()); 
    } 

    private void TestCreate2() 
    { 
     var mocker = new Mock<ISomeInterface>(); 
     mocker.Setup(x => x.Create2("Test")).Returns(4); 
     var result = mocker.Object.Create2("Test"); 
    } 

TestCreate2 работает и возвращает результат высмеивали «4»
TestCreate однако возвращает «0» вместо из "3"

Что мне нужно, чтобы мочить методы, которые принимают пользовательские классы в качестве аргументов, а не простые int и строки?

ответ

3

Да, это потому, что вы установили TestCreate для возврата 3, когда он получает экземпляр SomeClass, который вы передали во время вызова Setup. Однако, поскольку вы обновляете экземпляр inline, тогда экземпляр, прошедший во время фактического вызова Create, не совпадает. Любой из перечисленных ниже вариантов устранит вашу проблему ...

private void TestCreate() 
{ 
    var mocker = new Mock<ISomeInterface>(); 
    mocker.Setup(x => x.Create(It.IsAny<SomeClass>())).Returns(3); 
    var result = mocker.Object.Create(new SomeClass()); 
} 

private void TestCreate() 
{ 
    var mocker = new Mock<ISomeInterface>(); 
    var someClass = new SomeClass(); 
    mocker.Setup(x => x.Create(someClass)).Returns(3); 
    var result = mocker.Object.Create(someClass); 
}