1

我正在玩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”“预期'奇怪的符号',得到'�'”

有谁知道发生了什么?

4

1 回答 1

0

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

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

于 2011-11-14T22:00:25.077 回答