Поблочное тестирование пустые методы/насмешка возражает контрольным знакам

Когда поблочное тестирование кодовая база, каковы контрольные знаки, что я должен использовать фиктивные объекты?

Это было бы столь же просто как видящий много вызовов к другим объектам в кодовой базе?

Кроме того, как был бы я методы модульного теста, которые не возвращают значения? Таким образом, если я метод возвращается пусто, но печатает в файл, я просто проверяю содержание файла?

Насмешка для внешних зависимостей, таким образом, это - буквально все, нет? Файловая система, дб, сеть, и т.д...

6
задан Finglas 13 February 2010 в 10:25
поделиться

3 ответа

Если уж на то пошло, я, вероятно, слишком часто использую моки.

Всякий раз, когда класс делает вызов другого класса, обычно я моделирую этот вызов и проверяю, что вызов был сделан с правильными параметрами. В других случаях у меня будет юнит-тест, который проверяет, правильно ли ведет себя конкретный код высмеиваемого объекта.

Пример:

[Test]
public void FooMoo_callsBarBaz_whenXisGreaterThan5()
{
    int TEST_DATA = 6;
    var bar = new Mock<Bar>();
    bar.Setup(x => x.Baz(It.Is<int>(i == TEST_DATA)))
       .Verifiable();

    var foo = new Foo(bar.Object);

    foo.moo(TEST_DATA);

    bar.Verify();
}

...
[Test]
public void BarBaz_doesSomething_whenCalled()
{
   // another test
}

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

Я предпочитаю небольшие лаконичные тесты. Легче писать, легче поддерживать, легче понять замысел теста.

2
ответ дан 17 December 2019 в 22:12
поделиться

Моки / заглушки / подделки / тестовые дубли и т. Д. . отлично подходят для модульных тестов и позволяют тестировать тестируемый класс / систему изолированно. Интеграционные тесты могут не использовать никаких имитаций; они фактически попадают в базу данных или другую внешнюю зависимость.

Когда нужно, вы используете макет или заглушку. Обычно это происходит потому, что класс, который вы пытаетесь протестировать, зависит от интерфейса. Для TDD вы хотите программировать интерфейсы, а не реализации, и использовать внедрение зависимостей (вообще говоря).

Очень простой случай:

public class ClassToTest
{
   public ClassToTest(IDependency dependency)
   {
      _dependency = dependency;
   }

   public bool MethodToTest()
   {
      return _dependency.DoSomething();
   }
}

IDependency - это интерфейс, возможно, с дорогостоящими вызовами (доступ к базе данных, вызовы веб-служб и т. Д.). Метод тестирования может содержать код, похожий на:

// Arrange

var mock = new Mock<IDependency>();

mock.Setup(x => x.DoSomething()).Returns(true);

var systemUnderTest = new ClassToTest(mock.Object);

// Act

bool result = systemUnderTest.MethodToTest();

// Assert

Assert.That(result, Is.True);

Обратите внимание, что я провожу тестирование состояния (как предлагает @Finglas), и я только утверждаю против тестируемой системы (экземпляр класса, который я тестирую). Я мог бы проверить значения свойств (состояние) или возвращаемое значение метода, как показывает этот случай.

Я рекомендую прочитать Искусство модульного тестирования , особенно если вы используете .NET.

0
ответ дан 17 December 2019 в 22:12
поделиться

Возможно, потребуется также убедиться в том, что база данных настроена на использование ANSI 92 для распознавания СЧЕТЧИК в качестве допустимого типа данных.

В Access 2007 перейдите к разделу Параметры доступа, дизайнеры объектов, синтаксис совместимости SQL Server (ANSI 92) для установки этого параметра.

-121--4043317-

Хорошо, чтобы ответить на мой собственный вопрос:

Как уже упоминалось ранее, лучше всего использовать Google Maps API, он поддерживает много форматов, но по нескольким причинам я решил пойти с JSON.

Ниже приведены шаги для выполнения JSON-запроса в Google Maps и получения координат запроса. Обратите внимание, что не все верные проверки выполнены, это только подтверждение концепции.

1) Скачать JSON фреймворк/библиотеку для iPhone, есть несколько, я выбрал пойти с этот , это очень хорошо и кажется активным проектом, плюс несколько коммерческих приложений, кажется, используют его. Поэтому добавьте его в свой проект (инструкции здесь ).

2) Чтобы запросить Google Maps адрес, нам нужно создать URL-адрес запроса следующим образом: http://maps.google.com/maps/geo?q=Paris+France

Этот URL-адрес возвращает объект JSON для запроса «Париж + Франция».

3) Код:

//Method to handle the UISearchBar "Search", 
- (void) searchBarSearchButtonClicked:(UISearchBar *)theSearchBar 
{
    //Perform the JSON query.
    [self searchCoordinatesForAddress:[searchBar text]];

    //Hide the keyboard.
    [searchBar resignFirstResponder];
}

После того, как мы обработаем поиск UISearchBar, мы должны сделать запрос в Google Maps:

- (void) searchCoordinatesForAddress:(NSString *)inAddress
{
    //Build the string to Query Google Maps.
    NSMutableString *urlString = [NSMutableString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@?output=json",inAddress];

    //Replace Spaces with a '+' character.
    [urlString setString:[urlString stringByReplacingOccurrencesOfString:@" " withString:@"+"]];

    //Create NSURL string from a formate URL string.
    NSURL *url = [NSURL URLWithString:urlString];

    //Setup and start an async download.
    //Note that we should test for reachability!.
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    [connection release];
    [request release];
}

Мы должны, конечно же, затем обработать ответ сервера, (Примечание: много проверок не хватает)

//It's called when the results of [[NSURLConnection alloc] initWithRequest:request delegate:self] come back.
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{   
    //The string received from google's servers
    NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    //JSON Framework magic to obtain a dictionary from the jsonString.
    NSDictionary *results = [jsonString JSONValue];

    //Now we need to obtain our coordinates
    NSArray *placemark  = [results objectForKey:@"Placemark"];
    NSArray *coordinates = [[placemark objectAtIndex:0] valueForKeyPath:@"Point.coordinates"];

    //I put my coordinates in my array.
    double longitude = [[coordinates objectAtIndex:0] doubleValue];
    double latitude = [[coordinates objectAtIndex:1] doubleValue];

    //Debug.
    //NSLog(@"Latitude - Longitude: %f %f", latitude, longitude);

    //I zoom my map to the area in question.
    [self zoomMapAndCenterAtLatitude:latitude andLongitude:longitude];

    [jsonString release];
}

Наконец, функция масштабировать мою карту, которая к настоящему времени должна быть тривиальной вещи.

- (void) zoomMapAndCenterAtLatitude:(double) latitude andLongitude:(double) longitude
{
    MKCoordinateRegion region;
    region.center.latitude  = latitude;
    region.center.longitude = longitude;

    //Set Zoom level using Span
    MKCoordinateSpan span;
    span.latitudeDelta  = .005;
    span.longitudeDelta = .005;
    region.span = span;

    //Move the map and zoom
    [mapView setRegion:region animated:YES];
}

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

EDIT:

Изменение имени одного метода на «seureHorForAddress:» из-за вопроса @ Leo. Я должен сказать, что этот метод является хорошим доказательством концепции, но если вы планируете загрузить большие JSON-файлы, вам придется добавить к объекту NSMuityData, чтобы сохранить весь запрос на сервере Google. (помните, что HTTP-запросы поступают по частям.)

-121--1156334-

Модульные тесты выполняются только для одной части кода, которая работает автономно внутри себя. Это означает, что его работа не зависит от других объектов. Следует использовать макеты, если вы выполняете программирование на основе теста или программирование на основе теста. Вы создадите макет (или заглушку, как я хотел бы ее назвать) функции, которую вы будете создавать, и установите определенные условия для теста pass. Первоначально функция возвращает false, и тест проваливается, что ожидается... затем вы пишете код, чтобы сделать реальную работу, пока она не пройдет.

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

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

По возможности необходимо всегда возвращать значение. Иногда возникают проблемы, когда вы уже возвращаете что-либо, но в C и C++ вы можете иметь выходные параметры, а затем использовать возвращаемое значение для проверки ошибок.

-1
ответ дан 17 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

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