我试图单元测试一个方法,并且它使用传递给模拟方法的字典向电子邮件添加附件。测试总是失败,通过一切似乎是正确的,但Assert
似乎没有验证。用xunit检查字典<字符串,流>
是否有一种特殊的单元测试字典的方式,一般来说,它的工作原理是设置为<string, Stream>
。代码在下面,但不要认为它与任何东西有关,但可能已经错误地设置了一些东西,我想我错过了一些明显的东西。
[Fact]
public void Process_ShouldAttachCsvStreamWhenBuildingEmailMessage()
{
//Arrange
var fixture = new Fixture();
var settings = fixture.Create<Settings>();
var sutFixtures = new SUTFixtures(true);
var response = RemoteClientResponseHelper.GetMockHttpWebResponse(sutFixtures.Items);
//deal with attachement
var csv = sutFixtures.ToCsv();
var bytes = Encoding.GetEncoding("iso-8859-1").GetBytes(csv);
var messageAttachments = new Dictionary<string, Stream> {{"MissingImages.csv", new MemoryStream(bytes)}};
var moqClientService = new Mock<IClientService>();
moqClientService.Setup(x => x.Call(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), null))
.Returns(response.Object);
Dictionary<string, Stream> attachmentsVerify = null;
var moqEmailService = new Mock<IEmailService>();
moqEmailService.Setup(
x =>
x.BuildMessage(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(),
It.IsAny<bool>(), It.IsAny<Dictionary<string, Stream>>()))
.Callback<string, string, string, string, bool, Dictionary<string, Stream>>(
(to, from, subject, body, isHtml, attachments) =>
{
attachmentsVerify = attachments;
});
//Act
var sut = new MissingImageNotificationStep(moqClientService.Object, moqEmailService.Object, settings);
sut.Process(new MappingData() { Parts = sutFixtures.DataTable });
//Assert
moqEmailService.Verify(m => m.BuildMessage(It.IsAny<string>(),
It.IsAny<string>(),
It.IsAny<string>(),
It.IsAny<string>(),
It.IsAny<bool>(),
It.IsAny<Dictionary<string, Stream>>()), Times.Once());
Assert.Equal(messageAttachments, attachmentsVerify);
}
UPDATE,我想过一个自定义比较,但也许认为这是已经存在的东西
一定很懒惰。我有一些工作,无论如何,我的情况下,看着比较器我必须做一些明确的铸造这是罚款在我的情况,但有点臭,因此我的代码需要重构,也不知道GetHash在这种情况下做任何事情,如果这个代码在测试之外使用,我会看看。
自定义比较
public class DictionaryComparer : IEqualityComparer<Dictionary<string, Stream>>
{
private readonly IEqualityComparer<Stream> _valueComparer;
public DictionaryComparer(IEqualityComparer<Stream> valueComparer = null)
{
this._valueComparer = valueComparer ?? EqualityComparer<Stream>.Default;
}
public bool Equals(Dictionary<string, Stream> x, Dictionary<string, Stream> y)
{
if (x.Count != y.Count)
return false;
if (x.Keys.Except(y.Keys).Any())
return false;
if (y.Keys.Except(x.Keys).Any())
return false;
foreach (var pair in x)
{
var xValue = pair.Value as MemoryStream;
var yValue = y[pair.Key] as MemoryStream;
if (xValue.Length != yValue.Length)
return false;
xValue.Position = 0;
yValue.Position = 0;
var xArray = xValue.ToArray();
var yArray = yValue.ToArray();
return xArray.SequenceEqual(yArray);
}
return true;
}
public int GetHashCode(Dictionary<string, Stream> obj)
{
unchecked
{
var hash = 17;
foreach (var key in obj.Keys)
{
hash = hash * 23 + key.GetHashCode();
}
return hash;
}
}
}
通过的xUnit
Assert.Equal(messageAttachments, attachmentsVerify, new DictionaryComparer());
您是否考虑重写Dictionary上的Equal方法? –