Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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# Rhino Mocks:AAA Synax:Assert属性是使用给定类型设置的_C#_Unit Testing_Nunit_Rhino Mocks - Fatal编程技术网

C# Rhino Mocks:AAA Synax:Assert属性是使用给定类型设置的

C# Rhino Mocks:AAA Synax:Assert属性是使用给定类型设置的,c#,unit-testing,nunit,rhino-mocks,C#,Unit Testing,Nunit,Rhino Mocks,我试图断言模拟对象中的属性是使用给定类型设置的。该属性具有抽象类型,并使用多种具体类型之一进行设置 这就是我要做的,它总是通过测试,而不管Foo.DoSomething()设置Foo.Bar的值是什么: [Test] public void DoSomething_SetsCorrectBar() { // Arrange Foo foo = MockRepository.GenerateMock<Foo>(); // Crea

我试图断言模拟对象中的属性是使用给定类型设置的。该属性具有抽象类型,并使用多种具体类型之一进行设置

这就是我要做的,它总是通过测试,而不管Foo.DoSomething()设置Foo.Bar的值是什么:

    [Test]
    public void DoSomething_SetsCorrectBar()
    {
        // Arrange
        Foo foo = MockRepository.GenerateMock<Foo>(); // Creates mock in Replay mode (what I want for AAA syntax).

        // Act
        foo.DoSomething();

        // Assert that DoSomething set Foo.Bar to an instance of CorrectBarSubclass
        foo.AssertWasCalled(foo => foo.Bar = null, options => options.WhenCalled(invocation => Assert.That(invocation.Arguments[0] is CorrectBarSubclass)));
    }
[测试]
公共无效DoSomething_setscortibar()
{
//安排
Foo-Foo=MockRepository.GenerateMock();//在重播模式下创建mock(我想要AAA语法)。
//表演
foo.DoSomething();
//断言DoSomething将Foo.Bar设置为CorrectBarSubclass的实例
调用foo.assertwas(foo=>foo.Bar=null,options=>options.WhenCalled(invocation=>Assert.That(invocation.Arguments[0]是CorrectBarSubclass));
}
描述了如何对具有给定值的属性集设置期望值,但我只想检查值的类型

如何对属性集进行断言,特别是对具有给定参数类型的属性集


更新: 上面的例子过于简单化了。我实际测试的是一个单独的状态类。它是“父对象”(在本例中是具有状态Foo的对象)可以处于的几种状态之一。我正在验证测试中的状态(称为BarOne)是否正确地将Foo.state设置为BarTwo的一个实例,此时正是转换状态的时候

一个更清楚的例子(实施了公认的解决方案)是:

    [Test]
    public void BarOne_DoSomething_SetsNextState()
    {
        // Arrange
        Foo foo = MockRepository.GenerateMock<Foo>(); // Creates mock in Replay mode (what I want for AAA syntax).
        foo.Stub(x => x.CreateBarTwoState()).Return(new BarTwo(foo));
        BarOne bar = new BarOne(foo); // We are testing the BarOne state independently of Foo, that's why we mock Foo but instantiate BarOne.

        // Act
        bar.DoSomething();

        // Assert that DoSomething set Foo.Bar to an instance of BarTwo
        foo.AssertWasCalled(foo => foo.Bar = Arg<BarTwo>.Is.TypeOf);
    }
[测试]
公共无效BarOne_DoSomething_SETNEXTSTATE()
{
//安排
Foo-Foo=MockRepository.GenerateMock();//在重播模式下创建mock(我想要AAA语法)。
Stub(x=>x.CreateBarTwoState()).Return(newbartwo(foo));
BarOne bar=new BarOne(foo);//我们独立于foo测试BarOne状态,这就是为什么我们模拟foo但实例化BarOne。
//表演
bar.DoSomething();
//断言DoSomething将Foo.Bar设置为BarTwo的实例
调用foo.assertwas(foo=>foo.Bar=Arg.Is.TypeOf);
}

可能是这样的:

[Test]
public void AddPlayer_GivesGameEnoughPlayersToStart_SetsNextState()
{
    // Arrange
    Foo foo = MockRepository.GenerateMock<Foo>(); // Creates mock in Replay mode (what I want for AAA syntax).
    foo.Expect(m => m.Bar = Arg<CorrectBarSubclass>.Is.TypeOf);
    // Act
    foo.DoSomething();
    //Assert
    foo.VerifyAllExpectations();
}
var foo = new Foo();
foo.DoSomething();
Assert.That(foo.Bar is CorrectBarSubclass);

我曾经遇到过类似的问题,我试图用存根谓词表达式来查找包含字符串的方法(当然是不可变的)。在我创建testPredicate之前不会成功,我将它传递给存根、实际SUT,最后传递给断言。下面的代码起作用

    [Test()]
    public void Search_Apartment_With_Spesific_Address()
    {
        //ARRANGE
        var repositoryMock = MockRepository.GenerateMock<IApartmentRepository>();
        var notificationMock = MockRepository.GenerateMock<INotificationService>();
        var service = new ApartmentService(repositoryMock, notificationMock);
        var apartment = new List<Apartment> {new Apartment {Address = "Elm Street 2"}}.AsQueryable();

        Expression<Func<Apartment, bool>> testPredicate = a => a.Address == "Elm Street 2";
        repositoryMock.Stub(x => x.Find(testPredicate)).Return(apartment);

        //ACT
        service.Find(testPredicate);

        //ASSERT
        repositoryMock.AssertWasCalled(x => x.Find(testPredicate));
    }
[Test()]
带有特定地址()的公共无效搜索公寓
{
//安排
var repositoryMock=MockRepository.GenerateMock();
var notificationMock=MockRepository.GenerateMock();
var服务=新的公寓服务(repositoryMock、notificationMock);
var公寓=新列表{新公寓{Address=“Elm Street 2”}}。AsQueryable();
表达式testPredicate=a=>a.Address==“Elm Street 2”;
repositoryMock.Stub(x=>x.Find(testPredicate)).Return(单元);
//表演
service.Find(testPredicate);
//断言
调用repositoryMock.assertwas(x=>x.Find(testPredicate));
}

编辑:此答案已修改并发送,以更正IQueryable存根问题。

我理解这只是一个小示例,但期望在此处对模拟对象调用Bar是没有意义的。你能粘贴一个更完整的例子吗?很好,Grzenio,更新了我上面的问题。谢谢——虽然我尝试了Arg.Is.TypeOf,但问题是另一个方法(创建CorrectBarSubclass实例的方法)需要被删除。这个例子是不可靠的,因为它是对我实际的Foo类的过度简化。它使用状态模式,我正在测试一个单独的状态类,以确保它在类上设置下一个正确的状态。更新原始问题以注意这一点。