Rhino Mocks демонстрирует различное поведение в режиме отладки

#c# #rhino-mocks

#c# #rhino-mocks

Вопрос:

У меня проблема, из-за которой простой метод Rhino Mock stub будет отлично работать при run модульном тестировании, но выдаст исключение Can't create mocks of sealed classes при выполнении в debug режиме. Я попытался заменить Do метод на Return , но это не изменило поведение.

Используя C # с Rhino Mocks 3.6, приношу извинения за то, что оскорбил кого-либо, заставив функцию добавления вычитать в модульном тесте 😉

Интерфейс

 public interface ICalculator
{
    int Add(int value, int value2);
}
  

Классы

 public class Calculator : ICalculator
{
    public int Add(int value, int value2)
    {
        return value   value2;
    }
}

public class Sums
{
    private ICalculator calculator;

    public Sums(ICalculator calculatorArg)
    {
        calculator = calculatorArg;
    }

    public int Add(int value, int value2)
    {
        return calculator.Add(value, value2);
    }
}
  

Модульный тест

 [TestMethod()]
public void AddTest()
{
    //ARRANGE
    var calculatorArg = MockRepository.GenerateMock<ICalculator>();

    Func<int, int, int> subtract = delegate(int valueArg, int value2Arg)
    {
        return valueArg - value2Arg;
    };
    calculatorArg.Stub(x => x.Add(-1,-1)).IgnoreArguments().Do(subtract);

    Sums target = new Sums(calculatorArg);

    int value = 5;
    int value2 = 3;
    int expected = 2;

    //ACT
    int actual = target.Add(value, value2);

    //ASSERT
    Assert.AreEqual(expected, actual);
}
  

Комментарии:

1. Какая версия .NET Framework? Этот код отлично работает для меня в обоих режимах под .NET 4.0 (и Rhino. Издевается над 3.6). Что произойдет, если вы используете GenerateStub вместо GenerateMock?

2. @PatrickSteele Хм, вы правы, я воссоздал проект, и он работает. Визуальная проверка между моим исходным и новым тестовыми проектами не показывает изменений — оба используют одну и ту же файловую структуру / содержимое и . Net framework (4.0). Я проведу полное сравнение и опубликую ответ

Ответ №1:

Только что возникла именно эта проблема. Я удалил скрытый файл .suo и, конечно же, он сработал.

Именно тогда я понял, что при удалении настроек параметры перехвата исключений также были удалены. Это не останавливалось ни при одном исключении. Повторное включение опции в «Debug»-> «Исключения …» привело к повторному появлению ошибки.

Однако это исключение первого шанса, поэтому простое нажатие F5 (Продолжить) перешагнет через него, и код будет выполняться фактически так, как ожидалось.

Короче говоря, решение удаления файла suo означает сброс настроек и, таким образом, игнорирование исключения.

Ответ №2:

Удалите файл suo

Объяснение: После того, как PatrickSteele любезно указал мне, что создание нового проекта с моим кодом действительно работает, я сравнил каждый файл в исходном и новом проектах и обнаружил, что отличаются только файлы suo. (кроме идентификаторов Guid, имен проектов и т.д.).

После удаления файла .suo для решения проблема была решена. Не мой любимый ответ на этот вопрос, но, тем не менее, ответ.

Комментарии:

1. Интересно… Спасибо за доработку.

2. Я только что воспроизвел эту точную проблему и исправил с помощью 3.6.0.0.