Самый простой способ - просто отфильтровать его внутри теста, например, с помощью вспомогательного метода. Однако обратите внимание, что сама строка также может быть нулевой.
Если вы хотите строки, которые могут быть null
, но не содержат null
символов:
[Property]
public bool TestIt(StringNoNulls s)
{
return s.Item == null || !s.Item.Contains("\0");
}
Если вы хотите ненулевые строки :
[Property]
public bool TestIt(NonNull<string> s)
{
return s != null;
}
Если вы хотите оба, у меня ничего нет из коробки! Но вы можете сделать что-то вроде:
public class CustomArbs
{
public static Arbitrary<string> ReallyNoNullsAnywhere()
{
return Arb.Default.String().Filter(s => s != null && !s.Contains("\0"));
}
}
[Property(Arbitrary = new[] { typeof(CustomArbs) })]
public bool TestIt(string s)
{
return s != null && !s.Contains("\0");
}
Также есть PropertiesAttribute
, который вы можете поместить в класс для переопределения всех произвольных экземпляров определенного набора типов во всех свойствах этого класса, поэтому Не нужно добавлять аргумент Arbitrary для каждого метода тестирования.
Шаблон, который я часто использую, состоит не в том, чтобы переопределить сам экземпляр Arbitrary<string>
, а в создании типа-оболочки, чтобы он потом стал понятен в Подпись, какую строку я получаю:
public class AntiNullString
{
public string Get { get; }
public AntiNullString(string s)
{
Get = s;
}
}
public class CustomArbs
{
public static Arbitrary<AntiNullString> ReallyNoNullsAnywhere()
{
return Arb.Default.String()
.Filter(s => s != null && !s.Contains("\0"))
.Convert(s => new AntiNullString(s), ans => ans.Get);
}
}
[Property(Arbitrary = new[] { typeof(CustomArbs) })]
public bool TestIt(AntiNullString s)
{
return s.Get != null && !s.Get.Contains("\0");
}