如何模拟特定功能

时间:2019-04-05 18:47:31

标签: c# unit-testing moq xunit

所以我要设置一个函数,但是我想尝试设置2个不同的参数,并且具有不同的返回值,该怎么办?

mockStateFixture.MockCouchDbClient.Setup(x => x.AuthenticatedQuery(
   //It.IsAny<Func<HttpClient, Task<HttpResponseMessage>>>(), First Parameter Function# 1: GetProfileByUpn Function
   NamedHttpClients.COUCHDB,
   httpClient))
  .ReturnsAsync(httpResponseMessageForProfileRecordByUpn);


mockStateFixture.MockCouchDbClient.Setup(x => x.AuthenticatedQuery(
    //It.IsAny<Func<HttpClient, Task<HttpResponseMessage>>>(), First Parameter Function# 2: UpdateProfile Function
    NamedHttpClients.COUCHDB,
    httpClient))
   .ReturnsAsync(httpResponseMessageForCreatedReturnResult);

所以第一个参数应该与第二个参数不同,它们的第一个参数也不同。

我正在设置一个名为AuthenticatedQuery的函数,但是具有不同的参数,如何设置不同的参数?

2 个答案:

答案 0 :(得分:3)

您似乎无法区分所显示的两个呼叫。我不确定您如何区分这两个电话。

如果您知道两个呼叫的顺序,则可以尝试使用SetupSequence

mockStateFixture.MockCouchDbClient.SetupSequence(x => x.AuthenticatedQuery(
    It.IsAny<Func<HttpClient, Task<HttpResponseMessage>>>(),
    NamedHttpClients.COUCHDB,
    httpClient))
  .ReturnsAsync(httpResponseMessageForProfileRecordByUpn)
  .ReturnsAsync(httpResponseMessageForCreatedReturnResult);

SetupSequence()调用之后,响应将按照您指定的顺序进行。

我还没有尝试过,所以我不确定ReturnsAsync()是否可以这样链接。

答案 1 :(得分:1)

尝试FakeItEasy-

IMockedInterface mock = A.Fake<IMockedInterface>();

Object result1 = new {};
Object result2 = new {};

A.CallTo(() => mock.MethodName(1)).Returns(Object1);
A.CallTo(() => mock.MethodName(2)).Returns(Object2);