Обычно мы используем pipe()
при использовании httpclient
.
this.http.get(url).pipe(map(a => b), catchError(error => this.handleError(error)));
Так же, как его комментарии httpClient.get()
:
blockquote>/** * Construct a GET request which interprets the body as JSON and returns it. * * @return an `Observable` of the body as type `T`. */
Так как он возвращает
Obervable
, то вы следуете по трубе к объединить функции в цепочку.Советы
- вы должны использовать
!==
и===
в JS, чтобы избежать странных результатов;- обычно мы не
subscribe
сразу после [ 119] и мы помещаем метод get в отдельный сервис ;
Если это - Java 5 или выше, Вы могли бы хотеть рассмотреть переключение на JUnit 4, который имеет поддержку параметризованных встроенных тестовых сценариев.
Хорошо, вот быстрый макет того, как JUnit 4 запускает параметризованные тесты, но сделанный в JUnit 3.8.2.
В основном я разделяю на подклассы и плохо угоняю класс TestSuite для заполнения списка тестов согласно векторному произведению testMethods и параметров.
К сожалению, я должен был скопировать несколько вспомогательных методов с самого TestSuite, и несколько деталей не прекрасны, таковы как названия тестов в IDE, являющемся тем же через наборы параметра (JUnit 4.x добавляет [0]
, [1]
, ...).
Тем не менее, это, кажется, хорошо работает в тексте и AWT TestRunner
s, что поставка с JUnit, а также в Eclipse.
Вот ParameterizedTestSuite и далее вниз (глупый) пример параметризованного теста с помощью него.
(заключительное примечание: я записал это с Java 5 в памяти, это должно быть тривиально для адаптации к 1,4 в случае необходимости),
ParameterizedTestSuite.java:
package junit.parameterized;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
public class ParameterizedTestSuite extends TestSuite {
public ParameterizedTestSuite(
final Class<? extends TestCase> testCaseClass,
final Collection<Object[]> parameters) {
setName(testCaseClass.getName());
final Constructor<?>[] constructors = testCaseClass.getConstructors();
if (constructors.length != 1) {
addTest(warning(testCaseClass.getName()
+ " must have a single public constructor."));
return;
}
final Collection<String> names = getTestMethods(testCaseClass);
final Constructor<?> constructor = constructors[0];
final Collection<TestCase> testCaseInstances = new ArrayList<TestCase>();
try {
for (final Object[] objects : parameters) {
for (final String name : names) {
TestCase testCase = (TestCase) constructor.newInstance(objects);
testCase.setName(name);
testCaseInstances.add(testCase);
}
}
} catch (IllegalArgumentException e) {
addConstructionException(e);
return;
} catch (InstantiationException e) {
addConstructionException(e);
return;
} catch (IllegalAccessException e) {
addConstructionException(e);
return;
} catch (InvocationTargetException e) {
addConstructionException(e);
return;
}
for (final TestCase testCase : testCaseInstances) {
addTest(testCase);
}
}
private Collection<String> getTestMethods(
final Class<? extends TestCase> testCaseClass) {
Class<?> superClass= testCaseClass;
final Collection<String> names= new ArrayList<String>();
while (Test.class.isAssignableFrom(superClass)) {
Method[] methods= superClass.getDeclaredMethods();
for (int i= 0; i < methods.length; i++) {
addTestMethod(methods[i], names, testCaseClass);
}
superClass = superClass.getSuperclass();
}
return names;
}
private void addTestMethod(Method m, Collection<String> names, Class<?> theClass) {
String name= m.getName();
if (names.contains(name))
return;
if (! isPublicTestMethod(m)) {
if (isTestMethod(m))
addTest(warning("Test method isn't public: "+m.getName()));
return;
}
names.add(name);
}
private boolean isPublicTestMethod(Method m) {
return isTestMethod(m) && Modifier.isPublic(m.getModifiers());
}
private boolean isTestMethod(Method m) {
String name= m.getName();
Class<?>[] parameters= m.getParameterTypes();
Class<?> returnType= m.getReturnType();
return parameters.length == 0 && name.startsWith("test") && returnType.equals(Void.TYPE);
}
private void addConstructionException(Exception e) {
addTest(warning("Instantiation of a testCase failed "
+ e.getClass().getName() + " " + e.getMessage()));
}
}
ParameterizedTest.java:
package junit.parameterized;
import java.util.Arrays;
import java.util.Collection;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.parameterized.ParameterizedTestSuite;
public class ParameterizedTest extends TestCase {
private final int value;
private int evilState;
public static Collection<Object[]> parameters() {
return Arrays.asList(
new Object[] { 1 },
new Object[] { 2 },
new Object[] { -2 }
);
}
public ParameterizedTest(final int value) {
this.value = value;
}
public void testMathPow() {
final int square = value * value;
final int powSquare = (int) Math.pow(value, 2) + evilState;
assertEquals(square, powSquare);
evilState++;
}
public void testIntDiv() {
final int div = value / value;
assertEquals(1, div);
}
public static Test suite() {
return new ParameterizedTestSuite(ParameterizedTest.class, parameters());
}
}
Примечание: evilState
переменная должна просто здесь показать, что все тестовые экземпляры отличаются, как они должны быть, и что нет никакого общего состояния между ними.
Вместо того, чтобы создавать параметризованный тестовый сценарий для нескольких/отличающихся бэкендов, Вы хотите протестировать против, я изучил бы создание моего краткого обзора тестовых сценариев. Каждая новая реализация Вашего API должна была бы предоставить реализацию класс TestCase.
Если у Вас в настоящее время есть метод тестирования, который смотрит что-то как
public void testSomething() {
API myAPI = new BlahAPI();
assertNotNull(myAPI.something());
}
просто добавьте абстрактный метод для TestCase, который возвращает определенный объект API использовать.
public abstract class AbstractTestCase extends TestCase {
public abstract API getAPIToTest();
public void testSomething() {
API myAPI = getAPIToTest();
assertNotNull(myAPI.something());
}
public void testSomethingElse() {
API myAPI = getAPIToTest();
assertNotNull(myAPI.somethingElse());
}
}
Затем TestCase для новой реализации, которую Вы хотите протестировать только, должен реализовать Ваш AbstractTestCase и предоставить конкретную реализацию класса API:
public class ImplementationXTestCase extends AbstractTestCase{
public API getAPIToTest() {
return new ImplementationX();
}
}
Затем все методы тестирования, которые тестируют API в абстрактном классе, выполняются автоматически.