【问题标题】:Pex and unicode encodingPex 和 unicode 编码
【发布时间】:2011-11-14 20:56:35
【问题描述】:

我正在玩Pex 并且有一个简单的课程。代码是:

public void WriteLine(string line)
{
    Contract.Requires(line != null);
    if (_stream == null)
        _stream = getStream();

    var writer = new StreamWriter(_stream);
    writer.WriteLine(line);
}

private Stream getStream()
{
    return File.Open(Path, FileMode.Append, FileAccess.Write);
}

我创建了以下PexMethod

[PexMethod(MaxRunsWithoutNewTests = 200)]
public void WriteLine(string line)
{
    var ms = new MemoryStream();

    MFile.BehaveAsNotImplemented();
    MFileStream.BehaveAsNotImplemented();
    MStreamWriter.BehaveAsNotImplemented( );

    MFile.OpenStringFileModeFileAccess = (p, m, a) => new FileStream(p, m);
    MFileStream.ConstructorStringFileMode = (s, p, m) => new StreamWriter(ms);
    MStreamWriter.AllInstances.BaseStreamGet = sw => ms;
    MStreamWriter.ConstructorStream = (sw, s) =>
    {
        ;
    };
    MTextWriter.AllInstances.WriteLineString = (tw, l) =>
    {
        var buf = Encoding.Unicode.GetBytes(line);
        ms.Write(buf, 0, buf.Length);
     };

     var path = "C:\test.txt";
     var target = new FileWriter(path);
     target.WriteLine(line);

     var buffer = ms.ToArray();
     var result = Encoding.Unicode.GetString(buffer);
     PexAssert.AreEqual<string>(line, result);
}

Pex Exploration 提出了这个单元测试:

[TestMethod]
[PexGeneratedBy(typeof(FileWriterTest))]
[PexRaisedException(typeof(PexAssertFailedException))]
[HostType("Moles")]
public void WriteLineThrowsPexAssertFailedException25()
{
    this.WriteLine("\udc00");
}

奇怪的是,栈一离开带有udc00的单元测试,进入参数化测试,param Line就用:'�'表示

如您所见,我正在使用 Unicode 进行所有缓冲。当我最终尝试从内存流中读取字符串时,我得到一个奇怪的符号,看起来像一个带有问号的菱形。

我得到的错误是:“PexAssertFailedException”“预期的'奇怪符号',得到'�'”

有人知道怎么回事吗?

【问题讨论】:

    标签: c# encoding tdd pex


    【解决方案1】:

    Encoding.Unicode 是 UTF-16,根本不能表示代理对(U+D800 到 U+DFFF)。当您尝试时,它们将替换为“替换字符”-字符 (U+FFFD)。

    令人惊讶的是,.NET 可以将代理对存储在字符串中。因此,当您对字符进行编码和稍后解码时,它将不再匹配原始字符串。

    【讨论】:

    • 如何阻止 Pex 在其探索中建议和使用代理对?
    • 这应该有效:PexAssume.IsFalse(stringVariable.ToCharArray().Any(c => char.IsSurrogatePair());
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    相关资源
    最近更新 更多