如何模拟 BitConverter.IsLittleEndian 与我的单元测试相反的环境?
How can I simulate an environment where BitConverter.IsLittleEndian is the opposite for my unit tests?
由于字节顺序,我正在使用 BitConverter.GetBytes
和 Array.Reverse
这两种方法从文件中读取和写入二进制数据。
我的单元测试通过了,实施似乎很好。
如何模拟 BitConverter.IsLittleEndian
与我的单元测试相反的环境?
扩展我的评论:您需要使用 IoC(控制反转)在需要的地方注入 BitConverterEx
实例。这个 class 有一个 "parameter":输出的字节顺序 byte[]
它将 read/write.
最后这个问题和常见问题差不多"how can I mock DateTime.Now
"
在单元测试中,您可以在可以控制处理器标志的地方注入 ManipulableBitConverterEx
而不是注入 BitConverterEx
。或者更准确地说,你应该独立地对 BitConverterEx
和你的 classes 进行单元测试,这样当你测试你的 classes 时,你就知道 BitConverterEx
的结果是正确的。
public class BitConverterEx
{
public bool ProcessorLittleEndian { get; protected set; }
public bool DataLittleEndian { get; protected set; }
public BitConverterEx(bool dataLittleEndian)
{
ProcessorLittleEndian = BitConverter.IsLittleEndian;
DataLittleEndian = dataLittleEndian;
}
public byte[] GetBytes(int value)
{
byte[] bytes = BitConverter.GetBytes(value);
if (DataLittleEndian != ProcessorLittleEndian)
{
Array.Reverse(bytes);
}
return bytes;
}
public int ToInt32(byte[] value, int startIndex)
{
if (DataLittleEndian == ProcessorLittleEndian)
{
return BitConverter.ToInt32(value, startIndex);
}
byte[] value2 = new byte[sizeof(int)];
Array.Copy(value, startIndex, value2, 0, value2.Length);
Array.Reverse(value2);
return BitConverter.ToInt32(value2, 0);
}
}
public class ManipulableBitConverterEx : BitConverterEx
{
public ManipulableBitConverterEx(bool processorLittleEndian, bool dataLittleEndian)
: base(dataLittleEndian)
{
ProcessorLittleEndian = processorLittleEndian;
}
}
请注意,如果您需要多次重复使用此 class,Array.Reverse
可能是 "slow"。有一些解决方案可以使用 shift、or、xor、...
来反转处理单个字节的数据类型的字节顺序
由于字节顺序,我正在使用 BitConverter.GetBytes
和 Array.Reverse
这两种方法从文件中读取和写入二进制数据。
我的单元测试通过了,实施似乎很好。
如何模拟 BitConverter.IsLittleEndian
与我的单元测试相反的环境?
扩展我的评论:您需要使用 IoC(控制反转)在需要的地方注入 BitConverterEx
实例。这个 class 有一个 "parameter":输出的字节顺序 byte[]
它将 read/write.
最后这个问题和常见问题差不多"how can I mock DateTime.Now
"
在单元测试中,您可以在可以控制处理器标志的地方注入 ManipulableBitConverterEx
而不是注入 BitConverterEx
。或者更准确地说,你应该独立地对 BitConverterEx
和你的 classes 进行单元测试,这样当你测试你的 classes 时,你就知道 BitConverterEx
的结果是正确的。
public class BitConverterEx
{
public bool ProcessorLittleEndian { get; protected set; }
public bool DataLittleEndian { get; protected set; }
public BitConverterEx(bool dataLittleEndian)
{
ProcessorLittleEndian = BitConverter.IsLittleEndian;
DataLittleEndian = dataLittleEndian;
}
public byte[] GetBytes(int value)
{
byte[] bytes = BitConverter.GetBytes(value);
if (DataLittleEndian != ProcessorLittleEndian)
{
Array.Reverse(bytes);
}
return bytes;
}
public int ToInt32(byte[] value, int startIndex)
{
if (DataLittleEndian == ProcessorLittleEndian)
{
return BitConverter.ToInt32(value, startIndex);
}
byte[] value2 = new byte[sizeof(int)];
Array.Copy(value, startIndex, value2, 0, value2.Length);
Array.Reverse(value2);
return BitConverter.ToInt32(value2, 0);
}
}
public class ManipulableBitConverterEx : BitConverterEx
{
public ManipulableBitConverterEx(bool processorLittleEndian, bool dataLittleEndian)
: base(dataLittleEndian)
{
ProcessorLittleEndian = processorLittleEndian;
}
}
请注意,如果您需要多次重复使用此 class,Array.Reverse
可能是 "slow"。有一些解决方案可以使用 shift、or、xor、...