Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NUnit是否提供了一种断言对象事件已订阅的方法?_C#_Unit Testing_Nunit - Fatal编程技术网

C# NUnit是否提供了一种断言对象事件已订阅的方法?

C# NUnit是否提供了一种断言对象事件已订阅的方法?,c#,unit-testing,nunit,C#,Unit Testing,Nunit,我有一个作为参数传递到方法中的对象。这个对象上有一个事件,当我用这个对象作为参数调用这个方法时,应该订阅这个事件 NUnit允许我检查这个吗 编辑:添加了一个代码示例: [Test] public void AddingToCollectionShouldHookPropertyChangedEventUp() { // Arrange: var viewModel = new viewModel(); var viewMo

我有一个作为参数传递到方法中的对象。这个对象上有一个事件,当我用这个对象作为参数调用这个方法时,应该订阅这个事件

NUnit允许我检查这个吗

编辑:添加了一个代码示例:

    [Test]
    public void AddingToCollectionShouldHookPropertyChangedEventUp()
    {
        // Arrange:
        var viewModel = new viewModel();
        var viewModelCollection = new viewModelCollection();

        // Act:
        viewModelCollection.AddViewModel(viewModel);

        // Assert that the property changed event is hooked up in some way:
        // This is commented out because I cannot do this. I left it here to  
        // illustrate what I want to achieve:
        //blockViewModel.PropertyChanged.Should().Not.Be.Null();
    }

您只需检查事件是否为null。如果它有订阅者,那么它将不会为空。

您无法获取事件状态;按照设计,您只能向它注册+=或从中注销-=。因此,NUnit没有提供扩展或其他机制来测试已订阅的事件

如果事件在接口上,则可以通过模拟类(您自己的或框架的模拟类,如Rhino)测试订阅

当然,您可以在任何情况下测试事件的行为

如果你发布一些代码,我相信有人会帮你想出一个有意义的测试。下面是一个示例,让您了解一些想法:

[Test]
public void ChangingTheWhateverProperty_TriggersPropertyChange()
    {

        // Create anonymous delegate which is also your test assertion
        PropertyChangedEventHandler anonymousDelegate = (sender, e) => Assert.AreEqual("Whatever", e.PropertyName);

        // Subscribe to the needed event
        vm.PropertyChanged += anonymousDelegate;

        // trigger the event
        vm.Whatever = "blah";
    }
HTH,
贝里尔

==使用您的代码修改示例=======

[Test]
    public void AddingToCollectionShouldHookPropertyChangedEventUp()
    {
        // Arrange: 
        var viewModel = new viewModel();
        var viewModelCollection = new viewModelCollection();

        // This *IS* your assert also, and will get called back when you Act
        // The only part you need to supply for this test is the property that gets fired when you add a viewmodel
        PropertyChangedEventHandler anonymousDelegate = (sender, e) => Assert.AreEqual("Whatever", e.PropertyName);

        // Subscribe to the needed event 
        viewModelCollection.PropertyChanged += anonymousDelegate;

        // Act: 
        viewModelCollection.AddViewModel(viewModel);
    }
==事件注册的rhino测试示例=====

   [Test]
    public void Test()
    {
        var mockCorpseKicker = MockRepository.GenerateMock<INotifyPropertyChanged>();
        mockCorpseKicker.PropertyChanged += null;
        mockCorpseKicker.AssertWasCalled(x => x.PropertyChanged += Arg<PropertyChangedEventHandler>.Is.Anything);
    }
[测试]
公开无效测试()
{
var mockcastekicker=MockRepository.GenerateMock();
mockkicker.PropertyChanged+=null;
调用mockkicker.assertwas(x=>x.PropertyChanged+=Arg.Is.Anything);
}

你能粘贴你的代码示例吗?你能展示这样做的代码吗?类似于“Assert.That(_vm.Workspaces.CollectionChanged,Is.Not.Null);”的内容无法通过编译器,因为“事件只能出现在+=或-=”的左侧”。这是假的。您无法从类本身的作用域之外获取调用列表。我一直在尝试避免使用模拟框架,但如果这是唯一的方法,我应该重新考虑。感谢您的回复。但是您不需要模拟Framework来测试将viewmodel添加到viewmodelcollection会触发您的属性更改。为了强调这一点,我增加了我的虚拟测试用例,但我不知道从您发布的内容可以看出您想要触发哪个属性。在我的测试中替换属性名,您将有一个工作测试,证明接线是正确的。我不想断言任何东西被触发。我试图断言某个事件已订阅。换句话说,我想确保在AddViewModel(ViewModel viewModelToAdd)方法中有一行表示viewModelToAdd.PropertyChanged+=PropertyChangedHandler;好的,Corpeskiker,查看最新的代码添加,它使用Rhinomock实现了您想要的功能。如果未设置事件,则测试失败;如果设置为包括null在内的任何值,则测试通过。你为什么要踢corpes呢??干杯,贝瑞尔,你是摇滚明星。var blockViewModel=MockRepository.GenerateMock();var blockViewModelCollection=new blockViewModelCollection();blockViewModelCollection.AddViewModel(blockViewModel);调用blockViewModel.AssertWasCalled(x=>x.PropertyChanged+=Arg.Is.Anything);