使用It.IsAny设置moq来模拟复杂类型

时间:2016-01-11 01:33:08

标签: c# visual-studio mocking nunit moq

我一直在浏览Moq的plural sight教程。使用Arrange,act,assert的AAA主体,我成功地模拟了一个名为 GetDeviceSettingsForSerialNumber

的方法
import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

public class MyPropertiesTest {

    private MyProperties myProperties;

    @Before
    public void setup() {

        myProperties = new MyProperties();

    }

    @Test
    public void testMyProperties() {

        assertNotNull(myProperties.getPropertyValue());

    }

}    

然而,在这一点上嘲笑一个稍微复杂的类型对我来说太难了,我正在寻求你的指导。

我正在测试的代码如下所示:

enter image description here

我开始尝试以下测试而没有运气:

[Test]
public void Interactions_should_be_called()
{
    //arange
    var mockConstructors = new Mock<IDeviceInteractions>();
    mockConstructors.Setup(x => x.GetDeviceSettingsForSerialNumber(It.IsAny<string>()));
    //Act
    var sut = new Device("123",123);
    sut.InitializeDeviceStatus();
    sut.InitializeDeviceSettings();
    //Assert
    mockConstructors.Verify();
} 

具体问题是如何模仿行为: [Test] public void serviceDisposable_use_should_be_called() { //arange var mockConstructors = new Mock<IWcfServiceProxy<PhysicianServiceContract>>(); mockConstructors.Setup(x => x.Use(It.IsAny < IWcfServiceProxy<PhysicianServiceContract> .GetPatientDeviceStatus(It.IsAny<int>()) >)); //Act var sut = new Device("123",123); sut.InitializeDeviceStatus(); //Assert mockConstructors.Verify(); }

如何模拟方法GetPatientDeviceStatus?

1 个答案:

答案 0 :(得分:1)

查看方法newInitializeDeviceStatus关键字的使用位置。这里因为new使用了模拟是不可能的,因为实例是直接创建的。

而是尝试更改实现,以便可以以某种方式从外部注入您需要模拟的实例。这例如是完成的。通过构造函数注入或通过属性注入。或者该方法可以将WcfServiceProxy的实例作为参数:

public void InitializeDeviceStatus(IWcfServiceProxy serviceDisposable)
{
    try 
    {
        DeviceStatus = serviceDisposable.Use(...);
    }
}

然后在测试中将模拟注入测试方法:

[Test]
public void serviceDisposable_use_should_be_called()
{
    //arange
    ...

    // Inject the mock here
    sut.InitializeDeviceStatus(mockConstructors.Object);

    //Assert
    ...
}