Мне удалось найти решение, используя 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
)
Вышеупомянутое регулярное выражение рассматривает термин как любой символ, который не является чем-то вроде скобки, запятой, скобок и т. Д. два слова, возможно, с разделителем двоеточия в середине.
Вы не используете свои фиктивные объекты правильно. При использовании фиктивных объектов, Вы означали тестировать, как Ваш код взаимодействует с другими объектами, на самом деле не используя реальные объекты. См. код ниже:
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()
метод?
Это имеет большой смысл. По существу Вы говорите, что я должен делать следующее:
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 требует?
Большая ошибка дразнит Систему под тестом (SUT), Вы тестируете что-то еще. Необходимо дразнить только зависимости SUT.
Я бы рекомендовал держаться подальше от имитации фреймворков до тех пор, пока вы не поймете, какие взаимодействия здесь происходят.
ИМО, лучше учиться с помощью созданных вручную тестовых двойников, а затем переходить к фиктивной структуре. Мое рассуждение:
Мокирующие фреймворки абстрагируются от того, что на самом деле происходит; Легче понять взаимодействия, если вам нужно явно создать свои зависимости, а затем следовать тестам в отладчике.
Легко неправильно использовать фреймворки. Если вы катаетесь самостоятельно, когда учитесь, вы с большей вероятностью поймете разницу между разными типами тестовых пар. Если вы сразу перейдете к фреймворку mock, вы легко сможете использовать mock, когда вам нужны заглушки, и наоборот - есть большая разница.
Думайте об этом так: в центре внимания находится тестируемый класс. Вы создаете его экземпляр, вызываете его методы, а затем утверждаете, что результат правильный. Если тестируемый класс имеет зависимости (например, что-то требуется в конструкторе), вы удовлетворяете эти зависимости, используя либо A: реальные классы, либо B: тестовые двойники.
Мы используем тестовые двойники, потому что они изолируют тестируемый класс , что означает, что вы можете использовать его код более контролируемым образом.
Например, если у вас есть класс, содержащий сетевой объект, вы не можете протестировать класс-владелец ' s процедуры обработки ошибок, которые обнаруживают мертвые соединения, если вы вынуждены использовать конкретный объект сетевого соединения. Вместо этого вы вставляете фальшивый объект подключения и приказываете ему генерировать исключение при вызове его метода «SendBytes».
Т.е. в каждом тесте зависимости тестируемого класса создаются специально для выполнения определенного фрагмента кода.