微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

设置时模拟未按预期运行

如何解决设置时模拟未按预期运行

我正在尝试在类 GetAll 的 xUnit-Project 中测试名称AuhtorRepository方法

public class AuthorRepository : IAuthorRepository
{
    private readonly IsqlDb _db;
    public string Connection { get; set; }
    public AuthorRepository(IsqlDb db)
    {
        _db = db;
    }

    public async Task<List<AuthorModel>> GetAll()
    {
        string sql = "SELECT * FROM Author";
        List<AuthorModel> authors = await _db.LoadDataAsync<AuthorModel,dynamic>(sql,new { },Connection);
        return authors; 
    }

}

在这方法中使用了 LoadDataAsync 方法,我将在我的测试中模拟它。

界面的结构是这样的。

public interface IsqlDb
{
    Task<List<T>> LoadDataAsync<T,U>(string sql,U parameters,string connection);
}

最后测试我的xUnit-Project。

using Autofac.Extras.Moq;
using DataAccess.Library;
using Moq;
using Repository.Library.Models;
using Repository.Library.Repositories;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;

namespace RespositoryTests
{
    public partial class AuhtorRepositoryTests
    {
        [Fact]
        public async Task GetAll_ShouldWorkd()
        {
            using (var autoMock = AutoMock.GetLoose())
            {
                //Arrange
                autoMock.Mock<IsqlDb>()
                    .Setup(x => x.LoadDataAsync<AuthorModel,dynamic>("SELECT * FROM Author"," "))
                    .ReturnsAsync(GetSamples());

                //Act
                var cls = autoMock.Create<AuthorRepository>();
                cls.Connection = " ";
                var expected = GetSamples();

                var acutal = await cls.GetAll();

                //Assert                
                Assert.Equal(expected.Count,acutal.Count);

            }

        }

        private List<AuthorModel> GetSamples()
        {
            var authors = new List<AuthorModel>();
            authors.Add(new AuthorModel { Id = 1,FirstName = "first name",LastName = "lastname" });
            authors.Add(new AuthorModel { Id = 3,FirstName = "Angela",LastName = "Merkel" });
            return authors;
        }
    }
}

项目结构如下: [1]:https://i.stack.imgur.com/F4TPT.png

测试失败并显示以下语句:

消息:System.NullReferenceException:未将对象引用设置为对象的实例。

所以我预计测试应该会通过。

到目前为止我尝试过的:

-> 我用相同的代码写了一个类似的项目,唯一的区别是项目结构。每个接口和类都在同一个测试项目中,并且测试通过了。

而在我的 BookApp 解决方案中,IsqlDb 适用于 DataAccess.Library 项目。

所以看起来在模拟中 ReturnAsync 方法没有返回值 来自我的 GetSamples。

请记住这一点

  • a) 这是我在 stackoverflow 上的第一篇文章
  • b) 我尝试迈出嘲笑的第一步......

尝试过:

 //Act
//var cls = autoMock.Create<AuthorRepository>();
//cls.Connection = "";
var cls = new AuthorRepository(autoMock.Create<IsqlDb>());
cls.Connection = "";
var expected = GetSamples();

var acutal = await cls.GetAll();

//Assert                
Assert.Equal(expected.Count,acutal.Count);

解决方法

默认情况下模拟返回 null,因为模拟成员的调用与设置的不匹配。参考 Moq Quickstart 以更好地了解如何使用 MOQ。

此处需要使用参数匹配器,因为 setup 中使用的匿名 new { } 与执行测试时实际使用的引用不匹配

//...

autoMock.Mock<ISqlDb>()
    .Setup(x => x.LoadDataAsync<AuthorModel,dynamic>("SELECT * FROM Author",It.IsAny<object>(),It.IsAny<string>()))
    .ReturnsAsync(GetSamples());

//...

注意使用 It.IsAny<object>() 来允许您传入的任何内容。

通过上述更改,测试按预期通过。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?