我有以下清除不完整地址的方法。例如:说出AddressLine1 =“ 800 Wash s st”,然后返回“ 800 Washington s st”。
对于这种方法,我通过AddressScrubbingApi
使用了ApiClientHelper
。因此,在当前代码中,我具有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.
}
我的问题如下
partyConversion.ScrubAddress()
方法中,它返回null。因此,这之后的行将引发Object reference null异常。
我是用错误的方式创建模拟吗?答案 0 :(得分:0)
似乎通过代码requestAddress
所传递的模拟AddressScrubbingRequest addressObject = BuildRequestObject(addressToBeScrubbed);
与创建的addressObject 等于不相等
在这种情况下,您可以在It.IsAny<AddressScrubbingRequest>()
期间将最后一个参数定义为Setup
,将调用您的模拟方法。
mock.Setup(m => m.CallPostApiAsync<AddressScrubbingResponse>
(AddressScrubbingApiKey, path, It.IsAny<AddressScrubbingRequest>()))