【问题标题】:mock method invocation returns null模拟方法调用返回 null
【发布时间】:2019-10-25 11:20:57
【问题描述】:

我有以下方法可以清除不完整的地址。例如:说 AddressLine1="800 Wash s st" 然后它返回“800 Washington s st”。 对于这种方法,我通过ApiClientHelper 使用AddressScrubbingApi。因此,在我当前的代码中,我有 ApiClientHelper 的依赖关系。

public async Task<PartyAddress> ScrubAddress(PartyAddress addressToBeScrubbed)
{
if (_baseApiClient == null)
{
 SetApiClient(new BaseApiClient());
}
AddressScrubbingRequest addressObject = BuildRequestObject(addressToBeScrubbed);
string path = "/v1/addresses/actions/scrub";
//this is the baseApiClient that is to be injected as mock in unit test
var scrubbedAddress = await _baseApiClient.CallPostApiAsync<AddressScrubbingResponse>(AddressScrubbingApiKey, path, addressObject);
    if (scrubbedAddress.Status == ValidationStatus.HighProbabilityMatch.ToString())
     {
      addressToBeScrubbed.Addr1 = scrubbedAddress.Primary;
      addressToBeScrubbed.Addr2 = scrubbedAddress.Secondary;        
      addressToBeScrubbed.StreetNumber = scrubbedAddress.HouseNumber;
      addressToBeScrubbed.City = scrubbedAddress.City;
      addressToBeScrubbed.StateProv = StateCode.GetId(scrubbedAddress.State).HasValue ? AcordConversionHelper.CreateCodeValue(scrubbedAddress.State, StateCode.GetId(scrubbedAddress.State)) : AcordConversionHelper.CreateCodeValue(null, null);
      addressToBeScrubbed.PostalCode = scrubbedAddress.Zip5;
      addressToBeScrubbed.ZipExtension = scrubbedAddress.Zip4;
      addressToBeScrubbed.StreetName = scrubbedAddress.Name;
     //some more fields here
     addressToBeScrubbed.SuccessfullyScrubbedDtTm = System.DateTime.Now;
     }
     else if (scrubbedAddress.Status == ValidationStatus.MultipleMatches.ToString() || scrubbedAddress.Status == ValidationStatus.LowProbabilityMatch.ToString())
     {
      addressToBeScrubbed.StreetName = scrubbedAddress.Name;
      //partyAddress.Address.StreetType = scrubbedAddress.StreetTypeDesignator;
      //PreDirection=scrubbedAddress.PreDirection;
      //PostDirection=scrubbedAddress.PostDirection;
      addressToBeScrubbed.SuccessfullyScrubbedDtTm = System.DateTime.Now;
      }
   return addressToBeScrubbed;
}

这是我目前尝试过的单元测试

public static async Task ConvertFromAcordScrubAddressTest()
{
TestHelper.InitializeAcordConversionMetadata();
ConvertFromAcord.PartyConversion partyConversion = new ConvertFromAcord.PartyConversion();
Address address = TestHelper.SetupPartyAddress();
var requestAddress = TestHelper.SetupRequestAddress(address);
var mock = new Mock<IBaseApiClient>();
partyConversion.SetApiClient(mock.Object);
string path = "/v1/addresses/actions/scrub";
mock.Setup(m => m.CallPostApiAsync<AddressScrubbingResponse>(AddressScrubbingApiKey, path, requestAddress))
                .ReturnsAsync(new AddressScrubbingResponse
                {
                    Status = "MultipleMatches",
                    Message = "Multiple matches were found for the address you entered.  Normally this is a result of not including East, West, North, or South in the address line.",
                    IsPhysicalMatch = false,
                    Primary = "800 N WASHINGTON ST",
                    Secondary = string.Empty,
                    City = "VAN WERT",
                    State = "OH",
                    Zip5 = "45891",
                    Zip4 = "1269",
                    HouseNumber = "800",
                    PostDirection = string.Empty,
                    Name = "Washington",
                    StreetTypeDesignator = "St",
                    PreDirection = "N",
                    PoBoxNumber = string.Empty,
                    UnitTypeDesignator = string.Empty,
                    UnitNumber = string.Empty,
                    PrivateMailBox = string.Empty
                });
var scrubbedAddress=await  partyConversion.ScrubAddress(address);

 // Assert.PropertyChanged(address, nameof(address.Addr1), t=>t.partyConversion.ScrubAddress(address));
// this is to test whether Addr1 property is set when a call to the partyConversion.ScrubAddress(address); is made in above.
}

我的问题如下

  1. 当我的模拟被传递时,在partyConversion.ScrubAddress() 方法中,它返回null。所以之后的行是抛出对象引用空异常。 我是否以错误的方式创建模拟?
  2. 如何测试此方法以检查属性更改?

【问题讨论】:

    标签: c# unit-testing xunit.net


    【解决方案1】:

    似乎传递的模拟 requestAddress 不是 equal 通过代码 AddressScrubbingRequest addressObject = BuildRequestObject(addressToBeScrubbed); 创建的 addressObject

    您可以在Setup 期间将最后一个参数定义为It.IsAny&lt;AddressScrubbingRequest&gt;(),在这种情况下,您的模拟方法将被调用。

    mock.Setup(m => m.CallPostApiAsync<AddressScrubbingResponse>
                     (AddressScrubbingApiKey, path, It.IsAny<AddressScrubbingRequest>()))
    

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 2020-01-21
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      相关资源
      最近更新 更多