2011-12-16 8 views
3
interface ISample 
{ 
    int Sum(int a,int b); 
    int Multiplication(int x,int a,int b); 
} 

class Sample 
{ 
    public int Sum(int a,int b) 
    { 
     return a+b; 
    } 

    public int Multiplication(int x,int a,int b) 
    { 
     return x*Sum(a,b); 
    } 
} 

Я хочу протестировать метод умножения. Но для того, чтобы протестировать метод умножения, метод sum должен насмехаться. Как я искупаю метод Sum? Возможно ли, что-то вроде этого?Как можно издеваться над двумя методами, зависящими от класса

+0

Вам не нужно издеваться ничего - насмешливо 'ISample' требуется только в классах, которые имеют зависимость от него. – Lee

+0

@ У методов здесь есть зависимости. – sinanakyazici

ответ

3

Как известно, вы можете использовать отдельные интерфейсы. Для примера

interface ISum{ 

    int Sum(int a, int b); 
} 

interface ISample 
{ 
    int Multiplication(int x, int a, int b); 
} 

public class Sample : ISample 
{ 
    ISum _sum; 
    public Sample(ISum sum) 
    { 
     _sum = sum; 
    } 

    int Multiplication(int x, int a, int b) 
    { 
     return x*_sum.Sum(a,b); 
    } 
} 

В коде тестирования:

[TestFixture] 
public class TestSample 
{ 
    [Test] 
    public void TestSample() 
    { 
     var mockSum = new Mock<ISum>(); 
     mockSum.Setup(); // fill this what you want 
     var sampleObj = new SampleObj(mockSum.Object); 
     //Do Some Asserts 
    } 

} 
4

Я бы проверил Sum самостоятельно, и для тестов умножения предположим, что Sum работает. Если он работает для тестов Sum, он также должен работать для умножения. Кроме того, некоторые будут утверждать, что как умножение делает свою вещь не должно быть известно в тестах. Что делать, если у вас есть другой алгоритм позже, который не зависит от Sum?

4

Вы не издеваетесь над классом, который вы тестируете, вы издеваетесь над классами, от которых он зависит.

Если вы действительно хотите протестировать метод Multiplication() независимо от метода Sum(), вам придется разделить его на свой собственный интерфейс и предоставить классу Sample экземпляр этого интерфейса, который он может использовать для выполнения суммы.

Альтернативой является просто сначала проверить метод Sum(). Если метод Sum() передает все свои тесты, вы можете быть уверены, что он работает правильно. Как только вы знаете, что он работает правильно, приемлемо использовать эти знания, проверяя метод Multiplication().

+0

Хороший ответ, согласно предложенной альтернативе - на самом деле невозможно проверить что-то в первую очередь (если это не сделано в одном и том же методе) - так как порядок выполнения тестов никогда не гарантируется. – Paul

+0

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

1

Единственный инструмент, который я использовал, который может выполнить то, о чем вы говорите, - Moles. Если вы используете Moq, это невозможно. Но, в любом случае, я бы предложил проверить ваш класс как единое целое. То есть, если вы написали тесты для Sum() и удовлетворены своим поведением, переходите к написанию тестов для Multipication(), и если они выставляют проблемы, исправьте их в Sum() или Multiplication, если необходимо.

2

Вместо того, чтобы пытаться «высмеять» звонок по номеру Sum в Multiplication, вы должны просто протестировать его независимо, так как вызов Sum является деталью реализации. Однако, если ваш реальный код несколько сложнее, можно добавить перегрузку, которая принимает Func:

public int Multiplication(int x,int a,int b) 
{ 
    return this.Multiplication(x, a, b, (a, b) => a + b); 
} 

public int Multiplication(int x,int a,int b, Func<int, int, int> sumFunc) 
{ 
    return x * sumFunc(a, b); 
} 

Вы можете предоставить свой собственный экземпляр sumFunc в ваших тестах.

В качестве альтернативы вы можете сделать виртуальную машину Sum и переопределить ее в своих методах тестирования, требующих ее замены на собственную реализацию.

2

Еще одно предложение - реализовать интерфейс явно - тогда вам придется вводить частные функции, которые могут совместно использоваться и тестироваться для каждого метода.

private int Sum(int a, int b) 
{ 
    return a+b; 
} 

int ISample.Sum(int a,int b) 
{ 
    return Sum(a,b); 
} 

int ISample.Multiplication(int x,int a,int b) 
{ 
    return x*Sum(a,b); 
} 
Смежные вопросы