C# 在Moq XUnit中找不到Guid

C# 在Moq XUnit中找不到Guid,c#,unit-testing,C#,Unit Testing,我遇到了一个问题,我找不到可以在模拟回购中看到的GUID。 GetAllStudentsAsync返回三个学生,其中一个学生的Id是我正在搜索的,但总是返回null-我做错了什么 回购方式: public async Task<Student> GetStudentByIdAsync(string id) { try { var Student = await dataContext.Students

我遇到了一个问题,我找不到可以在模拟回购中看到的GUID。 GetAllStudentsAsync返回三个学生,其中一个学生的Id是我正在搜索的,但总是返回null-我做错了什么

回购方式:

public async Task<Student> GetStudentByIdAsync(string id)
    {
        try
        {
            var Student = await dataContext.Students
                .FirstOrDefaultAsync(p => p.Id.ToString() == id);
            return Student;
        }
        catch (DbException ex)
        {
            logger.LogError(ex.Message);
            throw;
        }
    }
公共异步任务GetStudentByIdAsync(字符串id)
{
尝试
{
var Student=wait dataContext.Students
.FirstOrDefaultAsync(p=>p.Id.ToString()==Id);
留学生;
}
捕获(dbex异常)
{
logger.LogError(例如消息);
投掷;
}
}
单元测试类:

   public class RepositoryTests
        {
            private readonly IStudentRepository MockStudentRepository;
            private readonly IClassRepository MockClassRepository;
    
            public RepositoryTests()
            {
                var mockStudentRepository = new Mock<IStudentRepository>();
                var mockClassRepository = new Mock<IClassRepository>();
                
                IList<Class> Classs = new List<Class>
                {
                    new Class
                    {
                        Id = Guid.NewGuid(), Name = "Test Class One", Start = DateTime.Now,
                        Expiration = DateTime.Now.AddDays(1)
                    },
                    new Class
                    {
                        Id = Guid.NewGuid(), Name = "Test Class Two", Start = DateTime.Now, 
                        Expiration = DateTime.Now.AddDays(3)
                    }
                };
                
                IList<Student> Students = new List<Student>()
                {
                    new Student
                    {
                        Id = Guid.NewGuid(), Name = "Student One"
                    },
                    new Student
                    {
                        Id = new Guid(), Name = "Student Two"
                    },
                    new Student
                    {
                        Id = Guid.NewGuid(), Name = "Student Three"
                    }
                };
                var rnd = new Random();
                foreach (var p in Students)
                {
                    p.ClassId = Classs[rnd.Next(Classs.Count)].Id.ToString();
                }
    
                mockClassRepository
                    .Setup(r => r.GetActiveClasssAsync()).ReturnsAsync(Classs);
                mockStudentRepository
                    .Setup(r => r.GetAllStudentsAsync()).ReturnsAsync(Students);
                
                MockStudentRepository = mockStudentRepository.Object;
                MockClassRepository = mockClassRepository.Object;
            }
            
            [Fact]
            public void TestCanGetAllStudents()
            {
                var Students = MockStudentRepository.GetAllStudentsAsync().Result.ToList();
                Assert.NotEmpty(Students);
                Assert.IsType<List<Student>>(Students);
            }
    
            [Fact]
            public void TestCanGetStudentById()
            {
                var Students = MockStudentRepository.GetAllStudentsAsync().Result.ToList();
                // can see there's a student with an id of "00000000-0000-0000-0000-000000000000" but fails.
                var Student = MockStudentRepository
                    .GetStudentByIdAsync("00000000-0000-0000-0000-000000000000").Result;
                Assert.NotNull(Student);
                Assert.IsType<Student>(Student);
            }
    
        }
公共类RepositoryTests
{
私有只读是学生存储模拟学生存储;
私有只读IClassRepository MockClassRepository;
公共存储测试()
{
var mockStudentRepository=new Mock();
var mockClassRepository=new Mock();
IList Classs=新列表
{
新类
{
Id=Guid.NewGuid(),Name=“测试类一”,Start=DateTime.Now,
过期=DateTime.Now.AddDays(1)
},
新类
{
Id=Guid.NewGuid(),Name=“测试类2”,Start=DateTime.Now,
过期=DateTime.Now.AddDays(3)
}
};
IList Students=新列表()
{
新生
{
Id=Guid.NewGuid(),Name=“学生一号”
},
新生
{
Id=新Guid(),Name=“学生二”
},
新生
{
Id=Guid.NewGuid(),Name=“学生三”
}
};
var rnd=新随机数();
foreach(学生中的var p)
{
p、 ClassId=Classs[rnd.Next(Classs.Count)].Id.ToString();
}
mockClassRepository
.Setup(r=>r.GetActiveClasssAsync()).ReturnsAsync(Classs);
模拟推理
.Setup(r=>r.GetAllStudentsAsync()).ReturnsAsync(学生);
MockStudentRepository=MockStudentRepository.Object;
MockClassRepository=MockClassRepository.Object;
}
[事实]
公共无效测试CanGetAllStudents()
{
var Students=MockStudentRepository.GetAllStudentsAsync().Result.ToList();
Assert.NotEmpty(学生);
Assert.IsType(学生);
}
[事实]
公共无效TestCanGetStudentById()
{
var Students=MockStudentRepository.GetAllStudentsAsync().Result.ToList();
//可以看到一个id为“00000000-0000-0000-0000-000000000000”的学生失败了。
var Student=MockStudentRepository
.GetStudentByIdAsync(“00000000-0000-0000-0000-000000000000”)。结果;
Assert.NotNull(学生);
Assert.IsType(学生);
}
}
更新


我一直在尝试将id参数作为Guid类型或Guid作为字符串发送。这没有什么区别,但不管怎样,我可以看到默认的00000000-0000-0000-0000-000000000000作为id,这就是我正在解析的内容。

您从未为其设置任何模拟
r.GetStudentByIdAsync(“123”)
例如

mockStudentRepository.Setup(r=>r.GetStudentByIdAsync(It.IsAny()).ReturnsAsync(Students[0])

如果它不是在模拟中设置的,则调用
GetStudentByIdAsync(“此处的任何内容”)
将返回默认的student,即
null
,存储库中的上下文不是模拟的,只有方法

调用
MockStudentRepository.GetAllStudentsAsync()
不会填充存储库的上下文。
MockStudentRepository.GetAllStudentsAsync()
的模拟设置指定需要返回学生列表

如果要测试存储库中的逻辑,最好是模拟存储库中的数据上下文

看看我的,它可能会帮助您设置一个用于测试的模拟上下文

我注意到的另一件事是,您正在使用
void
测试中的
async
调用进行测试

我通常使用
async Task
而不是
void
来消除使用
.Result
来获得结果

因此,测试方法签名如下所示:

    [Fact]
    public async Task TestCanGetStudentById()
    {
        var Students = await MockStudentRepository.GetAllStudentsAsync();
        // can see there's a student with an id of "00000000-0000-0000-0000-000000000000" but fails.
        var Student = await MockStudentRepository
            .GetStudentByIdAsync("00000000-0000-0000-0000-000000000000");
        Assert.NotNull(Student);
        Assert.IsType<Student>(Student);
    }
[事实]
公共异步任务TestCanGetStudentById()
{
var Students=wait MockStudentRepository.GetAllStudentsAsync();
//可以看到一个id为“00000000-0000-0000-0000-000000000000”的学生失败了。
var Student=等待模拟studentrepository
.GetStudentByIdAsync(“00000000-0000-0000-0000-000000000000”);
Assert.NotNull(学生);
Assert.IsType(学生);
}
我过去在
void
测试中尝试测试
async
方法时遇到过问题,尤其是尝试附加到调试器时


然后,您应该能够进入您的
公共异步任务GetStudentByIdAsync(string id)
方法,查看
是否等待dataContext。Students
具有模拟学生列表。

您从未为其设置任何模拟
r.GetStudentByIdAsync(“123”)
例如

mockStudentRepository.Setup(r=>r.GetStuden