Как я могу использовать Фиктивные объекты в своих модульных тестах и все еще использовать Покрытие Кода?

Мне удалось найти решение, используя preg_match_all:

$input = "CADAVRES [FILM] (Canada : Québec, Érik Canuel, 2009, long métrage) FICTION";
preg_match_all("|[^-\\[\\](),/\\s]+(?:(?: :)? [^-\\[\\](),/]+)?|", $input, $matches);
print_r($matches[0]);

Array
(
    [0] => CADAVRES
    [1] => FILM
    [2] => Canada : Québec
    [3] => Érik Canuel
    [4] => 2009
    [5] => long métrage
    [6] => FICTION
)

Вышеупомянутое регулярное выражение рассматривает термин как любой символ, который не является чем-то вроде скобки, запятой, скобок и т. Д. два слова, возможно, с разделителем двоеточия в середине.

16
задан Kurt W. Leucht 6 June 2009 в 01:48
поделиться

4 ответа

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

using Moq;
using NUnitFramework;

namespace MyNameSpace
    {
        [TestFixture]
        public class MyClassTests
        {

            [Test]
            public void TestGetSomeString()
            {
                const string EXPECTED_STRING = "Some String!";

                Mock<IDependance> myMock = new Mock<IDependance>();
                myMock.Expect(m => m.GiveMeAString()).Returns("Hello World");

                MyClass myobject = new MyClass();

                string someString = myobject.GetSomeString(myMock.Object);

                Assert.AreEqual(EXPECTED_STRING, someString);
                myMock.VerifyAll();

            }

        }

        public class MyClass
        {

            public virtual string GetSomeString(IDependance objectThatITalkTo)
            {
                return objectThatITalkTo.GiveMeAString();
            }
        }

        public interface IDependance
        {
            string GiveMeAString();
        }
    }

Не похоже, что это делает что-либо полезное, когда Ваш код просто возвращает строку без любой логики позади него.

Действительная мощность прибывает если Вы GetSomeString() метод сделал некоторую логику, которая может изменить результат выходной строки в зависимости от возврата из IDependdance .GiveMeAString() метод, затем Вы видите, как Ваш метод обрабатывает неправильные данные, отправляемые от IDependdance интерфейс.

Что-то как:

 public virtual string GetSomeString(IDependance objectThatITalkTo)
 {
     if (objectThatITalkTo.GiveMeAString() == "Hello World")
         return "Hi";
     return null;
 }

Теперь, если у Вас есть эта строка в Вашем тесте:

myMock.Expect(m => m.GiveMeAString()).Returns(null);

Что произойдет с Вашим GetSomeString() метод?

17
ответ дан 30 November 2019 в 21:20
поделиться

Это имеет большой смысл. По существу Вы говорите, что я должен делать следующее:

public class MyClass
{
    public virtual string GetSomeString(MyOtherClass moc)
    {
        return moc.ToString();
    }
}

.....

Mock<MyOtherClass> myMock = new Mock<MyOtherClass>();

MyClass mc = new MyClass();

string someString = mc.GetSomeString(myMock.Object);
Assert.AreEqual(EXPECTED_STRING, someString);

По существу инстанцируя SUT и только с помощью насмешек для классов SUT требует?

0
ответ дан 23 October 2019 в 00:09
поделиться

Большая ошибка дразнит Систему под тестом (SUT), Вы тестируете что-то еще. Необходимо дразнить только зависимости SUT.

8
ответ дан 30 November 2019 в 21:20
поделиться

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

ИМО, лучше учиться с помощью созданных вручную тестовых двойников, а затем переходить к фиктивной структуре. Мое рассуждение:

  1. Мокирующие фреймворки абстрагируются от того, что на самом деле происходит; Легче понять взаимодействия, если вам нужно явно создать свои зависимости, а затем следовать тестам в отладчике.

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

Думайте об этом так: в центре внимания находится тестируемый класс. Вы создаете его экземпляр, вызываете его методы, а затем утверждаете, что результат правильный. Если тестируемый класс имеет зависимости (например, что-то требуется в конструкторе), вы удовлетворяете эти зависимости, используя либо A: реальные классы, либо B: тестовые двойники.

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

Например, если у вас есть класс, содержащий сетевой объект, вы не можете протестировать класс-владелец ' s процедуры обработки ошибок, которые обнаруживают мертвые соединения, если вы вынуждены использовать конкретный объект сетевого соединения. Вместо этого вы вставляете фальшивый объект подключения и приказываете ему генерировать исключение при вызове его метода «SendBytes».

Т.е. в каждом тесте зависимости тестируемого класса создаются специально для выполнения определенного фрагмента кода.

2
ответ дан 30 November 2019 в 21:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: