Эта перегрузка Raise.Event
принимает параметры как params object[]
. Мы можем передать массив байтов byref в качестве стандартного значения в этом массиве params (что означает, что мы не обеспечиваем безопасность времени компиляции для передаваемых нами аргументов события, но тест довольно быстро обнаружит это, если мы ошибемся :) ):
_theObject.OnGetData += Raise.Event<GetDataHandler>("name", theData);
Вот исполняемый пример:
using NSubstitute;
using Xunit;
public delegate bool GetDataHandler(string name, ref byte[] data);
public interface ISomeType {
event GetDataHandler OnGetData;
}
public class SampleFixture {
string lastNameUsed = "";
byte[] lastBytesUsed = new byte[0];
[Fact]
public void SomeTest() {
var sub = Substitute.For<ISomeType>();
var data = new byte[] { 0x42 };
sub.OnGetData += Sub_OnGetData;
sub.OnGetData += Raise.Event<GetDataHandler>("name", data);
Assert.Equal("name", lastNameUsed);
Assert.Equal(data, lastBytesUsed);
}
private bool Sub_OnGetData(string name, ref byte[] data) {
lastNameUsed = name;
lastBytesUsed = data;
return true;
}
}
Редактировать после получения дополнительной информации в комментарии.
Я не думаю, что NSubstitute поддерживает проверку значения, которое возвращается в этом случае.
Не зная точно, что вы пытаетесь протестировать, я могу предложить несколько общих подходов к тестированию подобных вещей.
Первый вариант — передать код тестового двойника (в данном случае реализацию ISomeType
), над которым у вас есть полный контроль. Если интерфейс не огромен, я бы рекомендовал этот подход.
Другой вариант — протестировать делегата и проводку по отдельности. Например, для этого класса:
public class ClassUnderTest {
public ClassUnderTest(ISomeType dep) {
dep.OnGetData += Dep_OnGetData;
}
public static bool Dep_OnGetData(string name, ref byte[] data) {
data = System.Text.Encoding.UTF8.GetBytes(name);
return true;
}
}
Мы можем протестировать делегат независимо, а затем проверить, подключили ли мы этот делегат:
[Fact]
public void TestDelegate() {
byte[] data = new byte[0];
var result = ClassUnderTest.Dep_OnGetData("hi", ref data);
Assert.True(result);
Assert.Equal(new byte[] { 104, 105 }, data);
}
[Fact]
public void TestWireup() {
var sub = Substitute.For<ISomeType>();
var subject = new ClassUnderTest(sub);
sub.Received().OnGetData += ClassUnderTest.Dep_OnGetData;
}
Я думаю, что тест делегата в этом случае потенциально очень полезен, но тест подключения, вероятно, не очень хорош, потому что он очень специфичен для конкретной реализации, а не для требуемого поведения/результата. Но в этом случае наблюдать конкретный эффект сложно, так что это возможный ответ.
В-третьих, мы можем использовать более проверяемую оболочку над рассматриваемой библиотекой. Или этот тест может быть совершенно не на том уровне — будьте осторожны с насмешливыми типами, которыми мы не владеем. (Я немного написал об этом здесь а>.)
Если вы можете предоставить немного больше информации о том, что вы пытаетесь протестировать в этом сценарии, я буду рад попытаться найти более разумный ответ. :)
person
David Tchepak
schedule
19.08.2019