在 Xamarin 中使用 Moq 进行 NUnit 单元测试

NUnit unit Testing with Moq in Xamarin

我在我的 Xamarin 应用程序中使用两个接口进行日志记录 (NLog)

ILoggingService

public interface ILoggingService
{
    void Info(string message);
    void Info(string format, params object[] args);

    void Error(string message);
    void Error(string format, params object[] args);
    void Error(Exception e, string message);
    void Error(Exception e, string format, params object[] args);

    void Fatal(string message);
    void Fatal(string format, params object[] args);
    void Fatal(Exception e, string message);
    void Fatal(Exception e, string format, params object[] args);

    void Debug(string message);
    void Debug(string format, params object[] args);

    void Trace(string message);
    void Trace(string format, params object[] args);

    void Warn(string message);
    void Warn(string format, params object[] args);
}

还有另一个界面

ILogManager

public interface ILogManager
{
      ILoggingService GetLog([System.Runtime.CompilerServices.CallerFilePath]string callerFilePath = "");
}

在我的测试项目中,我创建了这样的安装文件。

[SetUpFixture]
public class Setup
{
    public static readonly Mock<IDependencyService> MockedService = new Mock<IDependencyService>(MockBehavior.Strict);
    readonly Mock<ILogManager> _logManager = new Mock<ILogManager>(MockBehavior.Strict);
    readonly Mock<ILoggingService> _loggingService = new Mock<ILoggingService>(MockBehavior.Strict);

    [OneTimeSetUp]
    public void OneTimeSetUp()
    {
        MockedService.Setup(p => p.Get<ILogManager>()).Returns(_logManager.Object);
        MockedService.Setup(p => p.Get<ILoggingService>()).Returns(_logManager.Object.GetLog());
    }

    [OneTimeTearDown]
    public void OneTimeTearDown()
    {

    }
}

我想我在模拟界面时犯了一些错误。因此,我得到的 GetLog() 始终为空。

logger = _serviceLocator.Get<ILogManager>().GetLog(); // Always return null

谁能指导我解决我的问题。?在为提到的接口创建存根时似乎有些问题。

请帮忙

日志管理器 mock 从未为其 GetLog 成员配置 return 任何内容。因此在调用时它将 return null。

[OneTimeSetUp]
public void OneTimeSetUp() {

    _logManager.Setup(_ => _.GetLog(It.IsAny<string>())).Returns(_loggingService.Object);

    MockedService.Setup(p => p.Get<ILogManager>()).Returns(_logManager.Object);
    MockedService.Setup(p => p.Get<ILoggingService>()).Returns(_loggingService.Object);
}

您必须设置预期在测试时调用的成员的行为,否则它们将默认为默认的 return 类型,在本例中为 null。