Отчет Pex PexAssumeFailedException в заводском методе - PullRequest
1 голос
/ 18 декабря 2011

все!Я новичок в юнит-тестировании.Сейчас я тестирую проект с 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&amp;, 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);

Мой вопрос: как решить эту проблему, помогите!
Спасибо всем!

1 Ответ

0 голосов
/ 27 января 2012

Метод PexFactory используется для создания экземпляра сложного типа. В вашем случае FontData является абстрактным классом. Вы также не можете создавать экземпляр абстрактного класса. Используйте атрибут ниже перед вызовом метода.

[PexUseType(typeof(Type1FontData ))]
[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)
    }    
    }
}
...