2016-04-07 2 views
2

Я использовал FluentAssertions для тестирования модулей и начал смотреть на то, правильно ли выбраны Исключения. Я знаю, что могу использовать атрибут метода ExpectedExceptions, но я хотел бы изучить подход FluentAssertion, если это возможно.FluentAssertions Утверждение об исключении было брошено для перегруженного оператора

У меня есть Matrix класса (упрощенный для данного примера) с перегруженным оператором умножения:

public class Matrix 
{ 
    public int Rows { get; set; } 
    public int Columns { get; set; } 
    public float[,] Elements { get; set; } 

    public static Matrix operator *(Matrix m1, Matrix m2) 
    { 
     if (m1.Columns != m2.Rows) 
     { 
      throw new Exception("These matrices cant be multiplied"); 
     } 

     return new Matrix(1, 2, new float[,] { {1, 2} }); 
    } 
} 

, и я хотел бы проверить в случае исключений. Это то, что я до сих пор:

[TestMethod] 
//[ExpectedException(typeof(Exception), "These matrices cant be multiplied")] 
public void MatrixMultiplication_IncorrectMatrixSize_ExceptionTest() 
{ 
    // Arrange 
    var elementsA = new float[,] 
    { 
     {4, 7}, 
     {6, 8} 
    }; 

    var elementsB = new float[,] 
    { 
     {3, 0}, 
     {1, 1}, 
     {5, 2} 
    }; 

    Matrix A = new Matrix() {Rows=2, Columns=2, Elements=elementsA); 
    Matrix B = new Matrix() {Rows=3, Columns=2, Elements=elementsB); 

    // Act 
    Func<Matrix, Matrix, Matrix> act = (mA, mB) => mA * mB; 

    // Assert 
    act(A,B).ShouldThrow<Exception>().WithInnerMessage("These matrices cant be multiplied"); 
} 

Проблема у меня в том, что FluentAssertions не имеет метода ShouldThrow расширения для общего Func, и я не уверен, или как обернуть это в действие. Можно ли использовать FluentAssertions таким образом для этой ситуации или использовать FluentAssertions по-другому, или мне нужно будет использовать ExpectedExceptions?

+0

не поступаем [Docs] (https://github.com/dennisdoomen/fluentassertions/wiki # exceptions) объяснить это? – DavidG

+0

(например, как действие: 'Action act = (mA, mB) => {var x = mA * mB;}') – DavidG

+0

@DavidG Я смотрел документы, но для меня это не было дайте понять, что я должен делать в этом конкретном случае. Вы правы, я могу написать «Действие» таким образом и использовать его вместо 'Func', но расширение' ShouldThrow' по-прежнему не может быть применено. – Ayb4btu

ответ

1

Hooray для overthinking проблемы ...

Записывая TestMethod, как это сделал его работу:

[TestMethod] 
public void MatrixMultiplication_IncorrectMatrixSize_ExceptionTest() 
{ 
    // Arrange 
    var elementsA = new float[,] 
    { 
     {4, 7}, 
     {6, 8} 
    }; 

    var elementsB = new float[,] 
    { 
     {3, 0}, 
     {1, 1}, 
     {5, 2} 
    }; 

    Matrix A = new Matrix() {Rows=2, Columns=2, Elements=elementsA); 
    Matrix B = new Matrix() {Rows=3, Columns=2, Elements=elementsB); 

    // Act 
    Action act =() => { var x = A * B; }; 

    // Assert 
    act.ShouldThrow<Exception>().WithMessage("These matrices cant be multiplied"); 
} 
Смежные вопросы