C# 如何验证使用Moq调用的方法?

C# 如何验证使用Moq调用的方法?,c#,moq,C#,Moq,我试图验证调用GetFirefoxDriver()时是否调用了SetFirefoxOptions()。但不管出于什么原因,莫克一直告诉我它没有被叫来。我做错了什么 这是我的测试: [TestMethod] public void ShouldSetFirefoxOptions() { var stubCapabilities = new Mock<SauceCaps>().Object; var mockManager = new Mock<DriverMana

我试图验证调用
GetFirefoxDriver()
时是否调用了
SetFirefoxOptions()
。但不管出于什么原因,莫克一直告诉我它没有被叫来。我做错了什么

这是我的测试:

[TestMethod]
public void ShouldSetFirefoxOptions()
{
    var stubCapabilities = new Mock<SauceCaps>().Object;
    var mockManager = new Mock<DriverManager>();
    mockManager.Setup(
        m => m.GetFirefoxDriver(stubCapabilities)).
        Returns(It.IsAny<IWebDriver>());

    mockManager.Verify(
        m => m.SetFirefoxOptions(stubCapabilities));
}
[TestMethod]
public void应设置FirefoxOptions()
{
var stubCapabilities=new Mock().Object;
var mockManager=new Mock();
mockManager.Setup(
m=>m.GetFirefoxDriver(stubCapabilities))。
返回(It.IsAny());
mockManager。验证(
m=>m.SetFirefoxOptions(stubCapabilities));
}
DriverManager.cs:

public class DriverManager : IDriverManager
{
    public virtual Dictionary<string, object> SauceOptions { get; private set; }    

    public DriverManager()
    {
    }

    public virtual IWebDriver GetFirefoxDriver(SauceCaps sauceCaps)
    {
        var browserOptions = SetFirefoxOptions(sauceCaps);

        return new RemoteWebDriver(new Uri("https://ondemand.saucelabs.com/wd/hub"),
            browserOptions.ToCapabilities(), TimeSpan.FromSeconds(600));
    }

    public virtual FirefoxOptions SetFirefoxOptions(SauceCaps sauceCaps)
    {
        return new FirefoxOptions
        {
            BrowserVersion = sauceCaps.BrowserVersion, 
            PlatformName = sauceCaps.Os
        };
    }
}
公共类驱动程序管理器:IDriverManager
{
公共虚拟字典SauceOptions{get;private set;}
公共驱动器管理器()
{
}
公共虚拟IWebDriver GetFirefoxDriver(SauceCaps SauceCaps)
{
var browserOptions=SetFirefoxOptions(sauceCaps);
返回新的RemoteWebDriver(新Uri(“https://ondemand.saucelabs.com/wd/hub"),
browserOptions.ToCapabilities(),TimeSpan.FromSeconds(600));
}
公共虚拟FirefoxOptions设置FirefoxOptions(SauceCaps SauceCaps)
{
返回新的FirefoxOptions
{
BrowserVersion=sauceCaps.BrowserVersion,
PlatformName=sauceCaps.Os
};
}
}

您的代码的问题是不清楚您的系统在测试什么。您正在同时模拟和测试同一个类。虽然在技术上可以使用
moq
(使用CallBase),但原则上这是错误的方法

一种可能性是将
SetFirefoxOptions
提取到单独的
接口
中,并将其注入
驱动管理器
,例如

public interface IFirefoxOptionCreator
{
    FirefoxOptions SetFirefoxOptions(SauceCaps sauceCaps);
}

public DeviceManager(IFirefoxOptionCreator optionCreator)
{
    _optionCreator = optionCreator;
}

public virtual IWebDriver GetFirefoxDriver(SauceCaps sauceCaps)
{
    var browserOptions = _optionCreator.SetFirefoxOptions(sauceCaps);

    return new RemoteWebDriver(new Uri("https://ondemand.saucelabs.com/wd/hub"),
        browserOptions.ToCapabilities(), TimeSpan.FromSeconds(600));
}
然后,您可以轻松验证在单元测试中调用了is接口方法:

[TestMethod]
public void ShouldSetFirefoxOptions()
{
    // Arrange
    var stubCapabilities = new Mock<SauceCaps>().Object;    
    var optionCreatorMock = new Mock<IFirefoxOptionCreator>();
    optionCreatorMock.Setup(m => m.SetFirefoxOptions(It.IsAny<SauceCaps>()))
                     .Returns(new FirefoxOptions());
    var sut = new DriverManager();    

    // Act
    _ = sut.GetFirefoxDriver(stubCapabilities);

    // Assert
    optionCreatorMock.Verify(m => m.SetFirefoxOptions(stubCapabilities));
}
[TestMethod]
public void应设置FirefoxOptions()
{
//安排
var stubCapabilities=new Mock().Object;
var optionCreatorMock=new Mock();
optionCreatorMock.Setup(m=>m.SetFirefoxOptions(It.IsAny()))
.返回(新的FirefoxOptions());
var sut=new DriverManager();
//表演
_=sut.GetFirefoxDriver(stubCapabilities);
//断言
optionCreatorMock.Verify(m=>m.SetFirefoxOptions(stubCapabilities));
}

您的代码的问题是不清楚您的系统在测试什么。您正在同时模拟和测试同一个类。虽然在技术上可以使用
moq
(使用CallBase),但原则上这是错误的方法

一种可能性是将
SetFirefoxOptions
提取到单独的
接口
中,并将其注入
驱动管理器
,例如

public interface IFirefoxOptionCreator
{
    FirefoxOptions SetFirefoxOptions(SauceCaps sauceCaps);
}

public DeviceManager(IFirefoxOptionCreator optionCreator)
{
    _optionCreator = optionCreator;
}

public virtual IWebDriver GetFirefoxDriver(SauceCaps sauceCaps)
{
    var browserOptions = _optionCreator.SetFirefoxOptions(sauceCaps);

    return new RemoteWebDriver(new Uri("https://ondemand.saucelabs.com/wd/hub"),
        browserOptions.ToCapabilities(), TimeSpan.FromSeconds(600));
}
然后,您可以轻松验证在单元测试中调用了is接口方法:

[TestMethod]
public void ShouldSetFirefoxOptions()
{
    // Arrange
    var stubCapabilities = new Mock<SauceCaps>().Object;    
    var optionCreatorMock = new Mock<IFirefoxOptionCreator>();
    optionCreatorMock.Setup(m => m.SetFirefoxOptions(It.IsAny<SauceCaps>()))
                     .Returns(new FirefoxOptions());
    var sut = new DriverManager();    

    // Act
    _ = sut.GetFirefoxDriver(stubCapabilities);

    // Assert
    optionCreatorMock.Verify(m => m.SetFirefoxOptions(stubCapabilities));
}
[TestMethod]
public void应设置FirefoxOptions()
{
//安排
var stubCapabilities=new Mock().Object;
var optionCreatorMock=new Mock();
optionCreatorMock.Setup(m=>m.SetFirefoxOptions(It.IsAny()))
.返回(新的FirefoxOptions());
var sut=new DriverManager();
//表演
_=sut.GetFirefoxDriver(stubCapabilities);
//断言
optionCreatorMock.Verify(m=>m.SetFirefoxOptions(stubCapabilities));
}

你所说的“真正的”GetFirefoxDriver是什么意思?调试你的测试,在var browserviceOptions=SetFirefoxOptions(sauceCaps)上设置一个断点;并验证它是否停止。检查,您需要测试您的代码。你决定嘲笑它。现在您有两个问题,您所说的“真正的”GetFirefoxDriver是什么意思?调试您的测试,在var browserviceOptions=SetFirefoxOptions(sauceCaps)上放置一个断点;并验证它是否停止。检查,您需要测试您的代码。你决定嘲笑它。现在你有两个问题