все!Я новичок в юнит-тестировании.Сейчас я тестирую проект с Visual Studio 2010 и Pex, и у меня возникла следующая проблема:
Когда я запускаю Pex Exploration, и Пекс говорит мне, что "не удалось создать экземпляр Root.Reports.Type1FontData ", и сообщение с подробностями, о котором сообщил Пекс:
[TestMethod]
[PexGeneratedBy(typeof(FontDataTest))]
[Ignore]
[PexDescription("the test state was: assumption violation")]
public void sGetTextLineThrowsPexAssumeFailedException500()
{
string s;
int i = 0;
s =
this.sGetTextLine((FontData)null, (string)null, 0, ref i, TextSplitMode.Line);
}
--- Сведения об исключении
Microsoft.Pex.Framework.Exceptions.PexAssumeFailedException: FontDataTest.sGetTextLine (FontData, String, Double, Int32 &, TextSplitMode) в индексе сегмента 0 нуждается в объекте типа Type1FontData (некоторый объект # 0);расширенная последовательность ExSig # 1
1.Я просто хочу протестировать метод абстрактного класса 'FontData.sGetTextLine ()', код которого показан ниже:
namespace Root.Reports {
internal abstract class FontData {
internal String sGetTextLine(String sText, Double rWidthMax, ref Int32 iStart, TextSplitMode textSplitMode) {
if (iStart > sText.Length) {
throw new ReportException("start position out of range");
}
if (iStart == sText.Length) {
iStart++;
return "";
}
Int32 iStartCopy = iStart;
StringBuilder sb = new StringBuilder(120);
// ...
}
}
}
2.Calss 'Type1FontData' является конкретным классом, основанным на абстрактном классе 'FontData', и код Type1FontData:
namespace Root.Reports {
internal class Type1FontData : FontData {
internal Type1FontData(FontDef fontDef, String _sFontName, FontStyle fontStyle)
: base(fontDef, fontStyle, FontData.Encoding.Cp1252)
{
// .....
}
}
}
3.Затем Pex поможет мне сгенерировать метод класса PUT 'FontDataTest.sGetTextLine ()':
namespace Root.Reports {
[PexClass(typeof(FontData))]
[PexAllowedExceptionFromTypeUnderTest(typeof(InvalidOperationException))]
[PexAllowedExceptionFromTypeUnderTest(typeof(ArgumentException), AcceptExceptionSubtypes = true)]
[TestClass]
public partial class FontDataTest
{
/// <summary>Test stub for sGetTextLine(String, Double, Int32&, TextSplitMode)</summary>
[PexMethod(TestEmissionFilter= PexTestEmissionFilter.All)]
internal string sGetTextLine(
[PexAssumeNotNull]FontData target,
string sText,
double rWidthMax,
ref int iStart,
TextSplitMode textSplitMode
)
{
string result = target.sGetTextLine(sText, rWidthMax, ref iStart, textSplitMode);
return result;
// TODO: add assertions to method FontDataTest.sGetTextLine(FontData, String, Double, Int32&, TextSplitMode)
}
}
}
}
4.После запуска Pex Exploration Pex показывает сообщение «Угадай, как создать Root.Reports.Type1FontData».Затем я нажимаю «Редактировать фабрику» и Пекс создает класс Type1FontDataFactory, код которого
namespace Root.Reports
{
public static partial class Type1FontDataFactory
{
[PexFactoryMethod(typeof(RT), "Root.Reports.Type1FontData")]
public static Type1FontData Create(
FontDef fontDef_fontDef,
string _sFontName_s,
FontStyle fontStyle_i,
FontDef fontDef_fontDef1,
object oFontDataX_o,
BitArray bitArray_UsedChar_bitArray
)
{
Type1FontData type1FontData
= new Type1FontData(fontDef_fontDef, _sFontName_s, fontStyle_i);
type1FontData.fontDef = fontDef_fontDef1;
type1FontData.oFontDataX = oFontDataX_o;
type1FontData.bitArray_UsedChar = bitArray_UsedChar_bitArray;
return type1FontData;
// TODO: Edit factory method of Type1FontData
// This method should be able to configure the object in all possible ways.
// Add as many parameters as needed,
// and assign their values to each field by using the API.
}
}
}
5.Когда я снова запустил Pex Exploration, я получил PexAssumeFailedException "не удалось создать экземпляр Root.Reports.Type1FontData".
6.Сводная информация о динамическом покрытии кода Type1FontDataFactory.Create () показала, что код пользователя или тест покрывают только следующий код:
Type1FontData type1FontData
= new Type1FontData(fontDef_fontDef, _sFontName_s, fontStyle_i);
Мой вопрос: как решить эту проблему, помогите!
Спасибо всем!