C# 在Moq XUnit中找不到Guid
我遇到了一个问题,我找不到可以在模拟回购中看到的GUID。 GetAllStudentsAsync返回三个学生,其中一个学生的Id是我正在搜索的,但总是返回null-我做错了什么 回购方式: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
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